1.實例方法、類方法、靜態方法
# 實例方法(只能被實例調用)、類方法(類和實例都可以直接調用)、靜態方法(類和實例都可以直接調用,不需要傳遞self或者cls)
class People(object):
# 實例方法
def exmaplesFun(self, name):
print('實例方法{},{}'.format(self,name))
# 類方法
@classmethod
def classFun(cls, name):
print('類方法{},{}'.format(cls,name))
#靜態方法
@staticmethod
def staticFun(name):
print('靜態方法{}'.format(name))
# 類可以直接調用 靜態方法和類方法
People.classFun('cpx')
People.staticFun('zsf')
# People.exmaplesFun('2') # 報錯 TypeError: exmaplesFun() missing 1 required positional argument: 'name'
# 類方法和實例方法也可以被實例對象調用
p = People()
p.exmaplesFun('gy')
p.staticFun('zsf')
p.classFun('cpx')
2.類方法的使用場景
# 類方法的使用場景:python不像java一個類有多個構造函數,python可以使用類方法實現多個構造函數的功能
class A(object):
def __init__(self, i):
self.i = i
@classmethod
def structure(cls,i,k):
a = cls(i)
a.k = k
return a
a = A(1)
a1 = A.structure(2,3)
print(a.i) # 輸出結果 1
print(a1.i,a1.k) # 輸出結果 2 3
# 類方法和靜態方法都可以被子類重寫
3.動態添加靜態方法和類方法
class Male(object):
pass
# 動態添加靜態方法
@staticmethod
def behavior():
print('動態添加靜態方法')
Male.behavior = behavior
Male.behavior() # 調用behavior方法成功
# 動態添加類方法
@classmethod
def characteristic(cls):
print('動態添加類方法')
Male.characteristic = characteristic
Male.characteristic() # 調用characteristic成功
# 使用實例調用動態添加的方法
m = Male()
m.behavior() # 調用成功
m.characteristic() # 調用成功
4.多態
# 向不同的對象發送同一條消息,不同的對象在接收時會產生不同的行爲(即方法)。
# 也就是說,每個對象可以用自己的方式去響應共同的消息。所謂消息,就是調用函數,不同的行爲就是指不同的實現,即執行不同的函數。
class Ani(object):
def run(self):
pass
class Cat(object):
def run(self):
print('Cat 4條腿 run')
class Person(object):
def run(self):
print('Person 2條腿 run')
c = Cat()
c.run()
p = Person()
p.run()