类多态Python


# 开发时间:2023/6/9  21:36
class Animal(object):
    def eat(self):
        print('Animal eat something')


class Dog(Animal):
    def eat(self):
        print('Dog eat meat')


class Cat(Animal):
    def eat(self):
        print('Cat eat fish')


class Person(object):
    def eat(self):
        print('Person eat everything')


def fun(animal):
    animal.eat()


fun(Animal())
fun(Dog())
fun(Cat())
fun(Person())
'''
静态语言和动态语言关于多态的区别:
*静态语言实现多态的三个必要条件
>继承
>方法重写
>父类引用指向子类对象
**动态语言的多态崇尚“鸭子类型”当看到一只鸟走起来像鸭子,游泳起来像鸭子,收起来也像鸭子,那么这只鸟就可以被称为鸭子。
在鸭子类型中,不需要关心对象是什么类型,到底是不是鸭子,只关心对象的行为。
Python是动态语言
'''
print('======================')


class A:
    pass


class B:
    pass


class C(A, B):
    def __init__(self, name, age):
        self.name = name
        self.age = age


x = C('Jack', 30)  # 创建C类的对象
print(x.__dict__)  # {'name': 'Jack', 'age': 30}   得到实例对象属性值的字典
print(
    C.__dict__)  # {'__module__': '__main__', '__init__': <function C.__init__ at 0x00000124BCE28670>, '__doc__': None}
print('======================')
print(x.__class__)  # 输出对象所属的类   <class '__main__.C'>
print(C.__bases__)  # 输出父类类型的元组  (<class '__main__.A'>, <class '__main__.B'>)
print(C.__base__)  # 输出先继承的谁就输出谁 <class '__main__.A'>
print(
    C.__mro__)  # 类的层次结构,先继承A,在继承B,最后继承lobject(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
print(A.__subclasses__())  # 子类列表 [<class '__main__.C'>]

print('======================')
print(dir(object))

print('======================')
a = 20
b = 100
c = a + b  # 两个整数类型的对象相加操作
d = a.__add__(b)

print(c, d)


class Student:
    def __init__(self, name, age=20):
        self.name = name
        self.age = age

    def __add__(self, other):  # 在类中重写__add__  方法可以实现两个对象的加法运算
        return self.name + other.name + ' age_sum:' + str(self.age + other.age)

    def __len__(self):
        return len(self.name)


stu1 = Student('张三')
stu2 = Student('jack', 39)
print(stu1 + stu2)
s = stu1.__add__(stu2)
print(s)
print(len(stu1))
print(len(stu2))
print('=========__len__=============')
lst = [11, 22, 33, 44]
print(len(lst))  #
print(lst.__len__())  #

print('=========__new__=============')


class Person(object):
    def __new__(cls, *args, **kwargs):
        print('__new__被执行了,cls的id值为{0}'.format(id(cls)))
        obj = super().__new__(cls)
        print('创建的对象的id为{0}'.format(id(obj)))
        return obj

    def __init__(self, name, age=20):
        print('__init__被执行了,self的id值为{0}'.format(id(self)))
        self.name = name
        self.age = age


print('object这个类对象的id为{0}'.format(id(object)))
print('Person这个类对象的id为{0}'.format(id(Person)))
#
p1 = Person('jack', 30)
print('p1类对象的id:{0}'.format(id(p1)))
'''
=========__new__=============
object这个类对象的id为140720220163584
Person这个类对象的id为2435573246032
__new__被执行了,cls的id值为2435573246032
创建的对象的id为2435580097968
__init__被执行了,self的id值为2435580097968
p1类对象的id:2435580097968

'''

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aFakeProgramer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值