python深入类和对象

鸭子类型和多态

列表的extend方法:

a = [1,2]
b = [3,4]
c = (5,6)
d = {7,8}
a.extend(b)
print(a)
a.extend(c)
print(a)
a.extend(d)
print(a)

上述代码输出的是
[1,2,3,4]
[1,2,3,4,5,6]
[1.2.3.4.5.6.7.8]

extend方法添加的可以是list,tuple以及set都可以,并不要求输入某个固定的类型,由extend的代码:
def extend(self, iterable: Iterable[_T]) -> None: …可知加入只需要是可迭代的类型即可。
所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态。
ps:extend方法无返回值,若直接print(a.extend(b))的输出值为none,直接a.extend(b),print(a)即可

抽象基类

抽象基类(abstract base class,ABC):抽象基类就是类里定义了纯虚成员函数的类。纯虚函数只提供了接口,并没有具体实现。抽象基类不能被实例化(不能创建对象),通常是作为基类供子类继承,子类中重写虚函数,实现具体的接口。

抽象基类就是定义各种方法而不做具体实现的类,任何继承自抽象基类的类必须实现这些方法,否则无法实例化。

from abc import ABCMeta
class Animals(metaclass=ABCMeta):
	@abstractmethod
	def __init__(self,name):
		pass
	def dead():
		pass
class Cat(Amimals):
	def __init__(self,name):
		self.name = name

上述代码中Animals类为抽象基类,即在()里加入metaclass=ABCMeta,
在类的方法中,若加入了@abstractmethod,则强制其子类必须重写此方法如代码中的__init__(),而没有@abstractmethod时,则不是必须,如代码中的dead().

判断某个对象的类型

isinstance:
isinstance考虑类的继承,isinstance(对象,类型)
type:不考虑类的继承,type(对象)
==和is的区别:
== value值相同
is 地址相同

类属性和实例属性查阅顺序

MRO算法
在这里插入图片描述
Python2.2之前的算法:金典类
深度搜索
DFS(deep first search):A->B->D->C->E

在这里插入图片描述
Python2.2版本之后,引入了BFS(广度优先搜索)
BFS:A->B->C->D

在Python2.3之后,Python采用了C3算法
在代码中执行 “ 类. __mro__ ” 即可知道执行顺序

对象的自省机制

自省是通过一定的机制查询到对象的内部结构
dir()
__dict__
type()
hasattr()
isinstance()

super函数

在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super 来实现

class Person(object):
	def __init__(self,name,age):
		self.name = name
		self.age = age
class Student(Person):
	def __init(self,name,age,grade):
		self.grade = grade
		super().__init__(self,name,age) 
		#python2的写法为super(Student,self).__init__(name,age)

在上述代码中Person为Student的父类,在Student类的__init__中用super函数省略了self.name = name ,self.age = age这两行。

重写了父类方法 为什么还要去调用super函数:
1:避免重复
2:扩展属性

在多个类的继承中super执行顺序可以根据__mro__来判断。

本人系萌新,如有不足请指正!

发布了24 篇原创文章 · 获赞 2 · 访问量 424

猜你喜欢

转载自blog.csdn.net/weixin_45735361/article/details/103706942