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

 

 

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