python-面向對象2

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()

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章