day23 01 類的命名空間

来源:https://www.cnblogs.com/wxm422562/archive/2019/05/14/10864928.html
-Advertisement-
Play Games

day23 01 類的命名空間 一、初識面向對象複習 定義類: class 函數:方法 動態屬性 變數:類屬性 靜態屬性 過程: (1)_init_方法:初始化:def _init_(self,參數) python幫我們創建了一個對象self 每當我們調用類的時候就會自動觸發這個方法 在_init_ ...


day23  01 類的命名空間

一、初識面向對象複習

定義類:

class

函數:方法 動態屬性

變數:類屬性 靜態屬性

過程:

(1)_init_方法:初始化:def _init_(self,參數)

 

  python幫我們創建了一個對象self

  每當我們調用類的時候就會自動觸發這個方法

  在_init_方法裡面可以對self進行賦值

self是什麼:self擁有屬性都屬於對象

  在類的內部,self就是一個對象

    比如:someone=person(),someone.walk==person.walk(someone),括弧裡面就是類裡面的walk方法所傳的參數self,

               而且這個參數必須傳

(2)實例化:對象=類(參數是_init_方法的)

  實例==對象 沒有區別

  對象查看屬性:對象.屬性

  對象調用方法:對象.方法名(參數)==類名.方法名(對象名,參數)

(3)實例:

  求正方形的周長和麵積:

class square:
    def __init__(self,side_len):
        self.side_len_=side_len
    def perimeter(self):
        return self.side_len_*4
    def area(self):
        return  self.side_len_**2
s=square(6)
print(s.perimeter())
print(s.area())

運行結果:

24
36

為什麼計算這個周長和麵積要使用類的調用和方法呢?

  正方形不同的地方就是邊長不一樣,不同的邊長的正方形就歸為一類

  有了固定的邊長,當調用類裡面的方法的時候就不需要再傳參數了:print(s.perimeter()) , print(s.area())都不需要再傳參數

何為python入門,面向對象入門:

python 入門:當你見到一個需求,你能翻譯成python語言

面向對象入門:當你見到一個需求,你能分析這個需求適不適合使用面向對象解決,如果適合,你能有一些想法

 

二、類和對象的命名空間

類裡面可以定義兩種屬性:

  靜態屬性:

  動態屬性:

定義一個類:一種課程course,屬性有:老師,課程名字,課程時間,課程費用

class course:
    language='Chinese'
    def __init__(self,teacher,course_name,period,price):
        self.teacher=teacher
        self.course_name=course_name
        self.period=period
        self.price=price
    def func(self):
        pass
python=course('李白','python','六個月','10000')
print(python.teacher)
print(python.course_name)
print(python.period)
print(python.price)
course.language='English' #直接類名.靜態屬性是可以修改靜態屬性的
print(course.language)
course.__dict__['language']='English'  #但是使用類的字典形式去修改靜態屬性是不可能的,會報錯
print(course.language)
print(python.language) #使用對象調用和查看類下的靜態屬性是可以的

運行結果:

Traceback (most recent call last):
李白
  File "<encoding error>", line 31, in <module>
python
TypeError: 'mappingproxy' object does not support item assignment
六個月
10000
Chinese
English

 

1、為什麼對象可以直接調用查看類下的靜態屬性呢?

print(python.language)---可以且不會報錯

類下的命名空間有:language, _init_, func
對象self裡面的命名空間有:teacher, course_name, period, price

類對象指針(記憶體地址可以有對象的指向類的):可以根據對象屬性找到對應的類,但是不能根據類找到對應的對象屬性
python.language:首先會在python裡面找,如果找不到就會向對應的類中找,找到了就可以調用查看了
course.name:是找不到的
假設多加一門課程linux:
python=course('李白','python','六個月','10000')
linux=course('秋白','linux','六個月','10000')

沒有改變類下的靜態屬性language,然後列印

print(python.language) 
print(linux.language)

是都可以列印出來的,且都是Chinese,而當通過

course.language='English'

修改靜態屬性之後,再次列印

print(python.language)
print(linux.language)

結果也都會隨之改變,都會變成English,當只通過對象修改類下的靜態屬性,在列印也是可以改的,如下:

python.language='English'
print(python.language)

 

2、對於不可變數據類下的類下屬性的操作

上面的 python.language='English', print(python.language)的改法實際上是在python對象下創建了一個新的language=‘English’,所以再python裡面可以找得到,就不會繼續往類下麵去找,在類下和linux下麵(Linux指向的是類的命名空間)並沒有創建新的language,類下的language是不可變的數據類下,所以當列印

print(linux.language)
print(course.language)

的結果還是原來的language的結果,即Chinese所以:

註意:對於不可變的數據類型來說,類變數最好使用類名操作

 

 3、對於可變的數據類型類下屬性的操作

比如前面的代碼中類下的屬性如果是: language=['Chinese'],然後按照下麵進行修改列印:

course.language[0]='English'
print(course.language)
print(linux.language)
python.language[0]='English'
print(python.language)
print(course.language)
print(linux.language)
運行結果:
['English']
['English']
['English']
['English']
['English']

此時通過對象名對類下的屬性進行修改的時候就可以修改成功了,為什麼呢?

(1)對於course.language[0]='English'的修改

類下的命名空間裡面的language指向一個list的地址,而list的0元素指向的是Chinese的地址,當你通過 course.language[0]='English'

去修改的時候,並沒有改變language指向list,對象指向類的命名空間的過程,所以最後都可以通過對象找得到改變的類下的屬性;

(2)對於python.language[0]='English'的修改

首先python對象先在自己的命名空間裡面找一個可變的數據類型language,找不到就往類的命名空間裡面找,因為對象指向類的命名空間,並且可以找到可變的數據類型language,所以在做python裡面的修改的時候,類下的也會隨之改變

 

註意:對於可變數據類型來說,通過對象名修改類下屬性是共用的,但是如果不是修改而是直接重新賦值的話是獨立的(類似於前面的不可變數據類型通過對象名對類下屬性是不能修改的)

 

4、創建一個類,每實例化一個對象就記錄下來,最終所有的對象都共用這個數據

比較簡單的代碼:

 

class Foo:
    count=0
    def __init__(self):
        Foo.count+=1 #使用類名操作類下屬性,對象名調用類下屬性的時候,類下屬性會隨著操作的變化而變化
f1=Foo()
f2=Foo()
print(f1.count)
print(f2.count)
f3=Foo()
print(f1.count) #實例化f3,然後通過對象f1操作類下屬性,也是可以的,說明通過類名操作類下屬性的結果是共用的

 

運行結果:

2
2
3

這樣就能滿足每次實例化的時候count就會加一

 

 

5、認識綁定方法

 一個類也是可以沒有_init_方法的初始化的,只不過這樣每次實例化的時候創建對象字典裡面就沒有任何值,是一個空的字典,代碼如下:

class Foo:
    def func(self):
        print('func')
f1=Foo()

運行結果:為空

class Foo:
    def func(self):
        print('func')
f1=Foo()
print(Foo.func)
print(f1.func)
#這裡的列印結果<bound method Foo.func of <__main__.Foo object at 0x0000016551112860>>會告訴我們一個綁定方法
print(f1)

什麼叫做綁定方法呢?

只有當對象去調用類下的方法的時候,調用方法的時候必須傳入就是該對象,這樣對象與方法之間就產生了一種綁定的關係,如果用類名調用就不會產生這種綁定關係

先暫時瞭解一下,因為後面會講到類外一種非綁定的方法

 

6、包中的_init_

為什麼我們每次導入一個包就會自動調用執行裡面的_init_文件?

 

因為每次導入一個包 import package====類的實例化過程,包每次被導入就成為一個對象了,所以只要導入就可以使用裡面的方法

比如:

import time

time.time

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本教程主要講述struts的簡單入門操作 使用的是myeclipse工具 1.創建web項目 2.複製struts必要的jar包到 WebRoot/WEB-INF/lib 下 jar包列表如下: 導入後的項目結構如圖 3.在 WebRoot/WEB-INF 下添加 web.xml 內容如下: 目錄結 ...
  • 偶然間知道到了字體反爬這個東西, 所以決定瞭解一下. 目標: https://maoyan.com/board/1 問題: 類似下圖中的票房數字無法獲取, 直接複製粘貼的話會顯示 □ 等無法識別的字元, 且網頁源碼中該類數字均被 &#xee5e;&#xe33d;&#xee5e;&#xec69;.&# ...
  • 11.1 集合元素的映射-map映射操作 11.1.1 看一個實際需求 要求:請將List(3,5,8)中所有的元素都*2,將其結果放到一個新的集合中返回,即返回一個新的List(6,10,16),請編寫程式實現 11.1.2 map映射操作 11.1.3 使用傳統方法 -案例演示 -上述案例演示的 ...
  • 1. 十次方中的前端知識點隨記 好久沒上傳筆記了,主要最近的筆記都零零散散,知識點也不集中,就不傳了;最近項目想用到前後端分離,而且前端我也想參與下,就先基本的學一遍,記點零星的筆記,各位能從中看到有用的東西最好 1.1. Node.js 1.1.1. node基本使用 1. 查看 中文文檔地址 v ...
  • 2.1 註意不同類型轉換 2.2 2.3 2.4 使用 迴圈 每次對 個位 取數相加 取數後 除以10 使前一位 變為 個位 繼續 判斷小於等於0時停止 2.5 註意 System.currentTimeMillis()方法 返回 long 形 需要轉換為 int 形 2.6 a 不能為 0 b2 ...
  • 5.14自我總結 一.python插件插件相關技巧彙總 安裝在cmd上運行 二.PyCharm的安裝註意事項 1.激活碼 可以網上找 2.對於當中的Python的設置 對於python的路徑不能選擇系統預設,要手動輸入python.exe的路徑 3.字體設置以及快捷設置 點擊File→setting ...
  • 介紹 jar命令用來對*.class文件進行壓縮,從而生成jar(archive)歸檔文件,避免文件過多. 定義一個文件: 編譯後,生成包.類,然後將這個common包進行壓縮為jar文件.輸入下麵命令: 列印如下: 當我們想往my.jar添加其它包的時候,輸入: 如果想解壓jar包,則輸入: 當我 ...
  • 1、封裝類似lower()的函數 2、封裝類似upper()的函數 3、封裝類似find()的函數 4、封裝類似rfind()的函數 5、封裝功能類似isdigit()的函數 6、封裝功能類似partition()的函數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...