Python干货——多态

112 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的18天,点击查看活动详情

👨‍🎓作者:Java学术趴

🏦仓库:GithubGitee

✏️博客:CSDN掘金InfoQ云+社区

💌公众号:Java学术趴

🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。

🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号Java学术趴联系小编。

☠️每日毒鸡汤:这个社会是存在不公平的,不要抱怨,因为没有用!人总是在反省中进步的!

👋大家好!我是你们的老朋友Java学术趴。今天给大家分享一下Python中的多态。

第十四章 多态

多态:定义时的类型和运行时的类型不一样,此时就成为多态

Python不支持Java和C#这一类型语言中多态的写法,但是原生多态,Python崇尚“鸭子类型”,利用Python伪代码实现Java和C#的多态。

实现多态,必须存在两个前提:

  • 继承:多态必须发生在父类和子类之间
  • 重写:子类必须重写父类的方法

# 多态。
class Animal(object):
​
    def eat(self):
        print('吃饭')
        pass
​
​
class Dog(Animal):
​
    # 该子类中特有的方法
    def eat(self):
        print('小狗吃骨头')
        pass
​
    pass
​
​
class Cat(Animal):
​
    # 该子类中特有的方法
    def eat(self):
        print('小猫吃鱼')
        pass
​
    pass
​
​
# 定义一个总的方法,调用不同对象的eat()方法
def all(obj):
    obj.eat()
    pass
​
​
# 定义一个list集合,其中存储全部的子类对象
listObj: list = [Dog(), Cat()]
​
​
# 循环遍历对象集合,调用子类中的重写方法
for item in listObj:
    # 调用方法
    all(item)
    pass# 小狗吃骨头
# 小猫吃鱼

第十五章 类属性和实例属性

15.1 类属性的概念

  • 类属性:就是类对象所拥有的属性,它被所有类对象的实例对象共有,类对象和实例对象可以访问。

15.2 实例属性的概念

  • 实例属性:实例对象所拥有的属性,只能通过实例对象访问。

15.3 类属性和类实例属性访问方式


# 类属性和类实例属性
class Animal(object):
    # 类属性
    name = '小白'
​
    # 实例属性
    def __init__(self, age):
        self.age = age
        pass
​
    pass
​
​
# 创建类的实例对象
animal = Animal(20)
​
# 类实例对象可以访问到类属性以及类实例属性
print(animal.name)
# 小白
print(animal.age)
# 20# 类可以访问类属性,但是不可以访问类实例属性
print(Animal.name)
# 小白
# print(Animal.age)
# 报错

总结:

  • 类属性可以被类和类实例对象共同使用。
  • 类实例属性只能提供给类实例对象使用,不可以提供给类使用。

15.4 类属性和类实例属性访问的优先级

打印出来的是柯基,说明它优先使用类的实例属性,如果类的实例属性中不存在再去找类属性。如果都不存在,则报错。


# 类属性和类实例属性
class Animal(object):
    # 类属性
    name = '小白'
​
    # 实例属性
    def __init__(self, age: int, name: str):
        self.age = age
        self.name = name
        pass
​
    pass
​
​
# 创建类的实例对象
# 这里需要注意,在创建类的时候指定了类实例属性的类型,这里必须给定指定类型的数据
animal = Animal(20, '柯基')
​
# 测试类对象使用类属性和类实例属性的优先级
print(animal.name)
# 柯基
# 打印出来的是柯基,说明它优先使用类的实例属性,如果类的实例属性中不存在再去找类属性。
# 如果都没有,则报错

所有实例对象的类对象指针指向同一类对象。实例属性在每个实例中独有一份,而类属性是所有实例对象共有一份。

15.5 类属性和类实例对象属性的修改

  • 类对象只能使用类属性,不可以使用类对象来修改类属性
  • 通过类对象来修改这个类属性,并不是修改,而是给类对象添加一个额外的属性
  • 类属性必须通过类调用进行修改

# 类属性和类实例属性
class Animal(object):
    # 类属性
    name = '小白'
​
    # 实例属性
    def __init__(self, age: int):
        self.age = age
        pass
    pass
​
​
animal = Animal(20)
​
# 修改类属性
animal.name = '大黑'
print(Animal.name)
# 小白。输出的还是小白,类的实例对象是无法修改类属性的,只能使用
# animal.name = '大黑' :这种形式只是在animal这个类实例对象上添加额外的name这个属性
# 类的实例对象可以通过以上这种方式进行添加新的属性# 如果需要修改类属性,需要使用类进行调用修改
Animal.name = '大黑'
print(Animal.name)
# 大黑