Pythonの高度なプログラミングスキル-1、クラスとオブジェクト

クラスとオブジェクト

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'>)

おすすめ

転載: blog.csdn.net/qq_37697566/article/details/103727326