# 开发时间: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
'''