類中定義的方法大體能夠分爲兩類:綁定方法和非綁定方法python
其中綁定方法又能夠分爲綁定到對象的方法和綁定到類的方法。sql
在類裏面沒有使用任何裝飾器修飾的方法就是綁定到對象的方法,這類方法是專門爲對象定製的函數
class Person: city = 'shanghai' def __init__(self,name,age): self.name = name self.age = age def speak(self): print(f'{self.name}會說話') peo = Person('xichen',18) print(peo.__dict__) peo.speak()
{'name':'xichen','age':18}ui
xichen會說話.net
print(Person.__dict__['speak'])
<function Person.speak at 0x10f0dd268>code
注意:對象
1.speak即綁定到對象的方法,這個方法不在對象的名稱空間中,而是在類的名稱空間中ip
2.經過對象調用綁定到對象的方法式,會有一個自動傳參的過程,也就是對象調用它的綁定方法時不用傳參數,會自動將這個調用綁定方法的對象傳過去(僅限第一個參數self,通常都叫self,也能夠寫成別的名稱);如果使用類調用,則第一個參數須要手動傳值。ci
# 1.經過對象調用 p = Person('xichen',18) p.speak()
xichen會說話字符串
# 2.經過類調用 Person.speak(p)
xichen會說話
類中使用 @classmethod修飾的方法就時綁定到類的方法,這類方法專門爲類定製。經過類名調用綁定到類的方法時,會將類自己當作參數傳給類方法的第一個參數。
class Person: city = 'shanghai' def __init__(self,name,age): self.name = name self.age = age @classmethod def speak(cls):# 約定俗成第一個參數名爲cls,也能夠定義爲其餘參數名 print(cls.__name__) print(f'{cls.__name__}是個類') Person.speak()
Person
Person是個類
注:經過類也能夠調用類的綁定方法,只是它仍是默認傳遞的第一個參數仍是這個對象對應的類
*經過對象調用類的綁定方法,它的輸出結果仍是同樣的
peo = Person('xichen',18) peo.speak()
Person
Person是個類
靜態方法
在類裏面使用@staticmethod修飾的方法就是非綁定方法,這類方法和普通定義的函數沒有區別,不與類或對象綁定,誰均可以調用,可是無論是類仍是對象調用都沒有自動傳值的效果。
class Person: city = 'shanghai' def __init__(self, name, age): self.name = name self.age = age @classmethod # 類的綁定方法 def speak(cls): # 約定俗成第一個參數名爲cls,也能夠定義爲其餘參數名 print(cls.__name__) print(f'{cls.__name__}是個類') @staticmethod # 非綁定方法,誰均可以調用 def get_city(obj): obj.city = 'beijing' print(obj.city) peo = Person('xichen',18) peo.get_city(peo) # 對象調用 Person.get_city(Person)# 類來調用
beijing
beijing
簡而言之,非綁定方法就是將普通方法放到了類的內部。
假設咱們如今有一個需求,須要讓Mysql實例化出的對象能夠從文件settings.py中讀取數據。
# settings.py IP = '1.1.1.10' PORT = 3306 NET = 27
# test.py import uuid class Mysql: def __init__(self, ip, port, net): self.uid = self.create_uid() self.ip = ip self.port = port self.net = net def tell_info(self): """查看ip地址和端口號""" print('%s:%s' % (self.ip, self.port)) @classmethod def from_conf(cls): return cls(IP, NET, PORT) @staticmethod def func(x, y): print('不與任何人綁定') @staticmethod def create_uid(): """隨機生成一個字符串""" return uuid.uuid1() # 默認的實例化方式:類名() obj = Mysql('10.10.0.9', 3307, 27)
obj.tell_info()
10.10.0.9:3307
若是函數體代碼須要用外部傳入的類,則應該將該函數定義成綁定給類的方法
若是函數體代碼須要用外部傳入的對象,則應該將該函數定義成綁定給對象的方法
# 一種新的實例化方式:從配置文件中讀取配置完成實例化 obj1 = Mysql.from_conf() obj1.tell_info()
1.1.1.10:27
print(obj.tell_info)
<bound method Mysql.tell_info of <main.Mysql object at 0x10f469240>>
print(obj.from_conf)
<bound method Mysql.from_conf of <class 'main.Mysql'>>
若是函數體代碼既不須要外部傳入的類也不須要外部傳入的對象,則應該將該函數定義成非綁定方法/普通函數
obj.func(1, 2)
不與任何人綁定
Mysql.func(3, 4)
不與任何人綁定
print(obj.func)
<function Mysql.func at 0x10f10e620>
print(Mysql.func)
<function Mysql.func at 0x10f10e620>
print(obj.uid)
a78489ec-92a3-11e9-b4d7-acde48001122