クラスとオブジェクト
1.アヒルモデル
鸭子类型(duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决定。
例:extend(iter)
lis=[1,2,3,4]
tup=(5,6,7,8)
dic={
'a','b','c','d'}
lis.extend(tup)
print(lis)
2.ポリモーフィズム
个人认为:定义的类型,可以由多种类型去使用,就称为多态
例:複数のサブクラス、親クラスを呼び出し、さまざまなタイプの値を親クラスに渡します
class AudioFile:
def __init__(self, filename):
if not filename.endswith(self.ext):
raise Exception("Invalid file format")
self.filename = filename
class MP3File(AudioFile):
ext = "mp3"
def play(self):
print("Playing {} as mp3".format(self.filename))
class WavFile(AudioFile):
ext = "wav"
def play(self):
print("Playing {} as wav".format(self.filename))
class OggFile(AudioFile):
ext = "ogg"
def play(self):
print("Playing {} as ogg".format(self.filename))
3.抽象基本クラス
作用:提示其他用户,此类为抽象类接口,需重写类方法
import abc
class A(metaclass=abc.ABCMeta):
@abc.abstractmethod
def play(self,key):
pass
class B(A):
def play1(self,key):
print('1')
b=B()
b.play(1)
最后显示结果:TypeError: Can't instantiate abstract class B with abstract methods play
4.isinstanceとtypeの違い
isinstance(变量,指定类型)一般用于判断某变量是否为指定类型,返回布尔类型
type(变量)返回类型内容,通常如果返回内容是地址 用IS比较,返回内容是值,用==比较
注:親クラスを決定する場合は、タイプではなくisinstanceのみを使用できます。isinstanceは継承を考慮します
在这里插入代码片
print('以下用变量比较区别')
j='k'
print(isinstance(j,str))
print(type(j) is str)
print('以下用类比较区别')
class C():
def play2(self):
pass
class A(C):
def play(self):
pass
class B(A):
def play1(self):
pass
b=B()
print(isinstance(b,C)) #会考虑继承
print(type(b) is C) #不会考虑继承
print(isinstance(b,B))
print(type(b) is B)
显示结果为
以下用变量比较区别
True
True
以下用类比较区别
True
False
True
True
5.クラス属性とインスタンス属性および検索順序
用__mro__ 查看排序顺序,使用C3算法
返回元组
class C():
def play2(self):
pass
class A(C):
def play(self):
pass
class B(A):
def play1(self):
pass
print(B.__mro__)
显示结果:(<class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>)
6.Pythonオブジェクトのイントロスペクションメカニズム
用__dict__查看类内部的方法(function)
返回字典
#内容为5部分
print(B.__dict__)
显示结果:{'__module__': '__main__', 'play1': <function B.play1 at 0x000001AB7EC10A60>, '__doc__': None}
7、スーパー
super继承子类方法,此顺序按照mro执行
class A:
def __init__(self):
print('A')
class B (A):
def __init__(self):
print('B')
super().__init__()
class C(A):
def __init__(self):
print('C')
super().__init__()
class D(B,C):
def __init__(self):
print('d')
super().__init__()
if __name__ == '__main__':
d=D()
print(D.mro())
print(D.__mro__)
显示结果为:
d
B
C
A
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)