__init__()
類有一個名爲__init__()的特殊方法(構造方法),該方法在類實例化時會被自動調用;
當然,__init__()方法也可以有參數,參數通過__init__()傳遞到類的實例化操作上,例如:
class Complex:
def __init__(self, realpart, imagpart):
self.r = realpart
self.i = imagpart
x = Complex(3.0, -4.5)
print(x.r, x.i) # 輸出結果:3.0 -4.5
self
self代表類的實例,代表當前對象的地址,self.__class__則指向對應的類
類的方法普通函數只有一個區別——它們必須有一個額外的第一個參數名稱,按照慣例是self(當然self不是python關鍵字,可以是任意名稱)。例如:
class Test:
def prt(self):
print(self)
print(self.__class__)
t = Test()
t.prt()
#輸出爲
<__main__.Test instance at 0x100771878>
__main__.Test
super()函數用於調用父類(超類)的一個方法
class Parent: # 定義父類
def myMethod(self):
print ('調用父類方法')
class Child(Parent): # 定義子類
def myMethod(self):
print ('調用子類方法')
c = Child() # 子類實例
c.myMethod() # 子類調用重寫方法
super(Child,c).myMethod() #用子類對象調用父類已被覆蓋的方法
#輸出
調用子類方法
調用父類方法
類的屬性(變量)和方法
- 屬性:類中的變量
- 私有屬性:以兩個下劃線開頭的屬性,表明該屬性爲私有,不能在類的外部被使用或直接訪問,在類內部的方法中可以被訪問
- 類的方法:在類的內部定義的函數,且必須包含參數self(可以爲其它)
- 類的私有方法:以兩個下劃線開頭的方法,只能在類的內部調用(self.__private_methods),不能在類的外部調用
- 類的私有屬性實例如下:
-
class JustCounter: __secretCount = 0 # 私有變量 publicCount = 0 # 公開變量 def count(self): self.__secretCount += 1 self.publicCount += 1 print (self.__secretCount) counter = JustCounter() counter.count() counter.count() print (counter.publicCount) print (counter.__secretCount) # 報錯,實例不能訪問私有變量 #輸出 1 2 2 Traceback (most recent call last): File "test.py", line 16, in <module> print (counter.__secretCount) # 報錯,實例不能訪問私有變量 AttributeError: 'JustCounter' object has no attribute '__secretCount'
- 類的私有方法實例如下:
-
class Site: def __init__(self, name, url): self.name = name # public self.__url = url # private def who(self): print('name : ', self.name) print('url : ', self.__url) def __foo(self): # 私有方法 print('這是私有方法') def foo(self): # 公共方法 print('這是公共方法') self.__foo() x = Site('菜鳥教程', 'www.runoob.com') x.who() # 正常輸出 x.foo() # 正常輸出 x.__foo() # 報錯
-
類的專有方法
- __init__:構造函數,在生成對象時調用
- __del__:析構函數,釋放對象時使用
- __str__:
- __repr__:打印,轉換
- __stitem__:按照索引[]賦值
- __getitem__:按照索引[]獲取值
- __len__:獲取長度
- __cmp__:比較運算
- __call__:函數調用
- __add__:加運算
- __sub__:減運算
- __mul__:乘運算
- __truediv__:除運算
- __mod__:求餘運算
- __pow__:乘方運算
針對__str__專有方法的直觀例子:
class people:
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
return '這個人的名字是%s,已經有%d歲了!'%(self.name,self.age)
a=people('孫悟空',999)
print(a)
#輸出
這個人的名字是孫悟空,已經有999歲了!
#如果沒有重載__str__運算符則會輸出:
如果沒有重載函數的話輸出的就是一串看不懂的字符串:
<__main__.people object at 0x00000272A730D278>
python同樣支持運算符重載,
如對專有方法 __add__重載
class Vector:
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return 'Vector (%d, %d)' % (self.a, self.b)
def __add__(self,other):
return Vector(self.a + other.a, self.b + other.b)
v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)
#輸出
Vector(7,8)
類的方法總結
- 普通方法:只能被對象調用, 默認有個self參數。
- 靜態方法: 類和對象訪問。用 @staticmethod 裝飾的不帶 self 參數的方法叫做靜態方法,類的靜態方法可以沒有參數,可以直接使用類名調用。
- 類方法: 類和對象訪問。默認有個 cls 參數,需要加上 @classmethod 裝飾器。
- 私有方法:類和對象都無法訪問。兩個下劃線開頭,只能類內部訪問。
- 多繼承情況下:從左到右查找父類的方法,找到爲止,不然就拋出異常
實例:
class Classname:
@staticmethod
def fun():
print('靜態方法')
@classmethod
def a(cls):
print('類方法')
# 普通方法
def b(self):
print('普通方法')
#私有方法
def __f(self):
print('私有方法')
Classname.fun()
Classname.a()
C = Classname()
C.fun()
C.a()
C.b()
C.__f() #出錯