包含python類的實例屬性詳解的詞條

本文目錄一覽:

Python中類與實例的其他說明解釋?

9.4. 一些說明

數據屬性會覆蓋同名的方法屬性。為了避免意外的名稱衝突,這在大型程序中是極難發現的 Bug,使用一些約定來減少衝突的機會是明智的。可能的約定包括:大寫方法名稱的首字母,使用一個唯一的小字元串(也許只是一個下劃線)作為數據屬性名稱的前綴,或者方法使用動詞而數據屬性使用名詞。

數據屬性可以被方法引用,也可以由一個對象的普通用戶(客戶)使用。換句話說,類不能用來實現純凈的數據類型。事實上,Python 中不可能強制隱藏數據——一切基於約定(如果需要,使用 C 編寫的 Python 實現可以完全隱藏實現細節並控制對象的訪問。這可以用來通過 C 語言擴展 Python)。

客戶應該謹慎的使用數據屬性——客戶可能通過踐踏他們的數據屬性而使那些由方法維護的常量變得混亂。注意:只要能避免衝突,客戶可以向一個實例對象添加他們自己的數據屬性,而不會影響方法的正確性——再次強調,命名約定可以避免很多麻煩。

從方法內部引用數據屬性(或其他方法)並沒有快捷方式。我覺得這實際上增加了方法的可讀性:當瀏覽一個方法時,在局部變數和實例變數之間不會出現令人費解的情況。

一般,方法的第一個參數被命名為 self。這僅僅是一個約定:對 Python 而言,名稱 self 絕對沒有任何特殊含義。(但是請注意:如果不遵循這個約定,對其他的 Python 程序員而言你的代碼可讀性就會變差,而且有些 類查看器 程序也可能是遵循此約定編寫的。)

類屬性的任何函數對象都為那個類的實例定義了一個方法。函數定義代碼不一定非得定義在類中:也可以將一個函數對象賦值給類中的一個局部變數。例如:

# Function defined outside the class

def f1(self, x, y):

return min(x, x+y)

class C:

f = f1

def g(self):

return ‘hello world’

h = g

現在 f, g 和 h 都是類 C 的屬性,引用的都是函數對象,因此它們都是 C 實例的方法-- h 嚴格等於 g 。要注意的是這種習慣通常只會迷惑程序的讀者。

python中類的實例對象的理解總結?

9.3.3. 實例對象

現在我們可以用實例對象作什麼?實例對象唯一可用的操作就是屬性引用。有兩種有效的屬性名。

數據屬性 相當於 Smalltalk 中的「實例變數」或 C++ 中的「數據成員」。和局部變數一樣,數據屬性不需要聲明,第一次使用時它們就會生成。例如,如果 x 是前面創建的 MyClass 實例,下面這段代碼會列印出 16 而在堆棧中留下多餘的東西:

x.counter = 1

while x.counter 10:

x.counter = x.counter * 2

print(x.counter)

del x.counter

另一種為實例對象所接受的引用屬性是 方法。方法是「屬於」一個對象的函數。(在 Python 中,方法不止是類實例所獨有:其它類型的對象也可有方法。例如,鏈表對象有 append,insert,remove,sort 等等方法。然而,在後面的介紹中,除非特別說明,我們提到的方法特指類方法)

實例對象的有效名稱依賴於它的類。按照定義,類中所有(用戶定義)的函數對象對應它的實例中的方法。所以在我們的例子中,x.f 是一個有效的方法引用,因為 MyClass.f 是一個函數。但 x.i 不是,因為 MyClass.i 不是函數。不過 x.f 和 MyClass.f 不同,它是一個 方法對象 ,不是一個函數對象。

Python中的類屬性和對象屬性的區別詳解

類屬性:

class Employee(object):

emCount=0

def __init__(self,name,salary):

self.nane=name

self.salary=salary

類屬性就是定義類的時候直接定義的屬性 emCount,類似於java裡面的static修飾的屬性,可以直接通過 類名.屬性名訪問:Employee.emCount

實例屬性是在__init()方法中定義的屬性,例如name,和salary,self是指向自己的,類似java的this關鍵字,實際是通過內置的方法setattr()完成的

可以通過重寫setatttr()進行類屬性的增加和獲取

python中類屬性和實例屬性的區別

今天一同事說踩了python的坑,

這確實是個「坑」

但是我覺得python之所以這樣設計,就是明確要求寫代碼的人知道自己在寫什麼^

^

python的實例屬性必須在__init__(self)

方法中定義,直接跟在類名後邊定義的屬性都默認是類屬性(類似於c++的static變數)。

而python實例又可以靈活的隨便增加屬性,便出現了圖片中看似詭異的現象。

———————————

我們來看一下他的原代碼:

你覺得輸出會是什麼?

結果是

model_path

分別是

“xx_model”

“oo_model”

而model_dict全都是第二次調用的結果,也就是oo_model生成的dict的值(注意,他前邊有一句self.model_dict.clear()

原因是什麼呢?

“坑”

就在

他是用self.xxxx

這種方式引用變數,而不是self.__class__.xxxx

(1)

self.model_path=path;

#這對self.model_path進行了賦值,python中的第一次賦值視為變數的定義!

(2)

self.xxxx這種格式的第一次賦值含義是什麼呢?–含義是:定義,也就是說定義了一個名為xxxx的實例屬性。

(3)

因此m1,m2的兩次調用,分別定義了對應的(不同的)self.model_path屬性。

而self.model_dict,從頭到尾都是

引用

它,從未進行過

賦值(重定義),所以引用的都是

類屬性

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/287443.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-23 13:07
下一篇 2024-12-23 13:07

相關推薦

發表回復

登錄後才能評論