一、實例方法,類方法,靜態(tài)方法
創(chuàng)新互聯(lián)主營伊春網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件定制開發(fā),伊春h5小程序開發(fā)搭建,伊春網(wǎng)站營銷推廣歡迎伊春等地區(qū)企業(yè)咨詢
我們首先寫一個類,里面包含這三種方法。
可以看到,我們用到了兩個裝飾器。
我們用類和實例分別調(diào)用下類方法
我們用類和實例分別調(diào)用下靜態(tài)方法
靜態(tài)方法其實就是把一個普通的函數(shù)寫在類里,與直接在外層寫一個函數(shù)是一樣的,本質(zhì)上是一個函數(shù)。
為了方便理解,我們分別打印下這些方法的類型
通過type()查看對象是方法還是函數(shù)
此外,還可以通過inspect模塊判斷某個對象是否是某種類型,返回布爾值。
用法
小Tips:概念理解
直接def定義的,我們叫做函數(shù)
把函數(shù)放到類里,我們叫做方法
方法可以通過裝飾器staticmethod轉(zhuǎn)為(放在方法里的)函數(shù)
繼承
一個類繼承另一個類時,會自動獲得另一個類的所有屬性和方法,被繼承的類稱之為父類,新類稱為子類。子類擁有父類所有的屬性和方法,并且可以定義自己的屬性和方法
我們以上邊的Rectangle類為父類來試一下
1)完全繼承
可以看到,子類完全繼承父類后,可以直接調(diào)用父類的所有方法。
2)部分繼承
部分繼承:繼承父類后,修改父類的同名方法
我們試一下,Square繼承Rectangle后,修改__init__()方法
3)拓展父類的方法
在保留父類中某個方法的代碼同時,對方法進行拓展
可以在方法中加入"super().方法名"來實現(xiàn)
4)@property
9.4. 一些說明
數(shù)據(jù)屬性會覆蓋同名的方法屬性。為了避免意外的名稱沖突,這在大型程序中是極難發(fā)現(xiàn)的 Bug,使用一些約定來減少沖突的機會是明智的。可能的約定包括:大寫方法名稱的首字母,使用一個唯一的小字符串(也許只是一個下劃線)作為數(shù)據(jù)屬性名稱的前綴,或者方法使用動詞而數(shù)據(jù)屬性使用名詞。
數(shù)據(jù)屬性可以被方法引用,也可以由一個對象的普通用戶(客戶)使用。換句話說,類不能用來實現(xiàn)純凈的數(shù)據(jù)類型。事實上,Python 中不可能強制隱藏數(shù)據(jù)——一切基于約定(如果需要,使用 C 編寫的 Python 實現(xiàn)可以完全隱藏實現(xiàn)細節(jié)并控制對象的訪問。這可以用來通過 C 語言擴展 Python)。
客戶應該謹慎的使用數(shù)據(jù)屬性——客戶可能通過踐踏他們的數(shù)據(jù)屬性而使那些由方法維護的常量變得混亂。注意:只要能避免沖突,客戶可以向一個實例對象添加他們自己的數(shù)據(jù)屬性,而不會影響方法的正確性——再次強調(diào),命名約定可以避免很多麻煩。
從方法內(nèi)部引用數(shù)據(jù)屬性(或其他方法)并沒有快捷方式。我覺得這實際上增加了方法的可讀性:當瀏覽一個方法時,在局部變量和實例變量之間不會出現(xiàn)令人費解的情況。
一般,方法的第一個參數(shù)被命名為 self。這僅僅是一個約定:對 Python 而言,名稱 self 絕對沒有任何特殊含義。(但是請注意:如果不遵循這個約定,對其他的 Python 程序員而言你的代碼可讀性就會變差,而且有些 類查看器 程序也可能是遵循此約定編寫的。)
類屬性的任何函數(shù)對象都為那個類的實例定義了一個方法。函數(shù)定義代碼不一定非得定義在類中:也可以將一個函數(shù)對象賦值給類中的一個局部變量。例如:
# 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
現(xiàn)在 f, g 和 h 都是類 C 的屬性,引用的都是函數(shù)對象,因此它們都是 C 實例的方法-- h 嚴格等于 g 。要注意的是這種習慣通常只會迷惑程序的讀者。
9.3.3. 實例對象
現(xiàn)在我們可以用實例對象作什么?實例對象唯一可用的操作就是屬性引用。有兩種有效的屬性名。
數(shù)據(jù)屬性 相當于 Smalltalk 中的“實例變量”或 C++ 中的“數(shù)據(jù)成員”。和局部變量一樣,數(shù)據(jù)屬性不需要聲明,第一次使用時它們就會生成。例如,如果 x 是前面創(chuàng)建的 MyClass 實例,下面這段代碼會打印出 16 而在堆棧中留下多余的東西:
x.counter = 1
while x.counter 10:
x.counter = x.counter * 2
print(x.counter)
del x.counter
另一種為實例對象所接受的引用屬性是 方法。方法是“屬于”一個對象的函數(shù)。(在 Python 中,方法不止是類實例所獨有:其它類型的對象也可有方法。例如,鏈表對象有 append,insert,remove,sort 等等方法。然而,在后面的介紹中,除非特別說明,我們提到的方法特指類方法)
實例對象的有效名稱依賴于它的類。按照定義,類中所有(用戶定義)的函數(shù)對象對應它的實例中的方法。所以在我們的例子中,x.f 是一個有效的方法引用,因為 MyClass.f 是一個函數(shù)。但 x.i 不是,因為 MyClass.i 不是函數(shù)。不過 x.f 和 MyClass.f 不同,它是一個 方法對象 ,不是一個函數(shù)對象。
題主你好,
python中創(chuàng)建新實例的時候, 如果相應的類中定義了__init__()方法的話, 會自動調(diào)用這個方法. 你可能認為名稱"init"和"__init__"差不多, 但計算機其實是個很笨的東西, 它會完全按照設(shè)計去執(zhí)行. 也就是說,在設(shè)計的時候就已經(jīng)定死了, 默認情況下, 創(chuàng)建新實例的時候, 會自動調(diào)用類中定義的__init__()方法, 只要你的方法名和__init__有一點不一樣也不行.
下圖是我在官網(wǎng)上找的關(guān)于__init__()調(diào)用的簡單說明:
高亮部分說的大概意思就是上面講的,如果相應類中定義了__init__()方法,則在創(chuàng)建該類實例的時候會自動調(diào)用里面定義的__init__()方法.
-----
希望可以幫到題主, 歡迎追問.
類,簡單來說就是一個函數(shù)的集合,在這個集合里面你定義了很多個函數(shù);方法,其實就是你定義的這些函數(shù)。在下面的例子中Class Plus就是一個類,嵌套在這個類里面的兩個函數(shù)就是所謂的方法,但是__init__只是用于初始化這個類,所以不算是方法。而get_result這個函數(shù)就是一個方法了。
舉個例子:
Class Plus:
def __init__(self, a,b)
self.a = a
self.b = b
def get_result(self)
return self.a + self.b
在上面這個例子中,self就是對象,這個對象里面有兩個參數(shù),一個是self.a,另一個是self.b,對象簡單來說就是自身具有多個屬性(也可以說是子變量)的變量而已。如果說對象是籠統(tǒng)的東西,那么實例就是具體的東西。對象只是一個模板,有一些屬性,而實例就是把數(shù)據(jù)填到這個模板里面去。比如這里你再這樣寫:c1 = Plus(1,2),這里c1就是一個實例,你還可以加一句:c2 = Plus(2,3),那c2也是一個實例,但是他們擁有共同的屬性和模板。下面的例子就是調(diào)用了類里面的方法:
result1 = c1.get_result() 3 輸出結(jié)果為3
result2 = c2.get_result() 5 輸出結(jié)果為5