クラスの継承
1. クラス継承の定義
まず、クラス継承の基本的な構文を見てみましょう:
class ClassName(BaseClassName): <statement-1> . . . <statement-N>
クラスを定義するときは、次のように記述できます。括弧内 冒頭で述べたように、継承クラスを記述する場合、クラスを継承する必要がない場合は、継承オブジェクト クラスも記述する必要があります。これは、Python ではオブジェクト クラスがすべてのクラスの親クラスであるためです。
もちろん、上記は単一継承ですが、Python は多重継承もサポートしています。具体的な構文は次のとおりです:
class ClassName(Base1,Base2,Base3): <statement-1> . . . <statement-N>
多重継承について注意すべき点が 1 つあります。親クラスの名前、サブクラスを使用する場合に指定しない場合、Python は括弧内の親クラスの順序で左から右に検索します。つまり、サブクラスにメソッドが見つからない場合は、次から検索します。左から右にメソッドが親クラスに含まれているかどうかを確認します。
それでは、継承されたサブクラスは何ができるのでしょうか?
継承されたサブクラスの利点:
親クラスのプロパティとメソッドを継承します
それらを自分で定義して、親クラスのプロパティとメソッドをオーバーライドできます
2. 親クラスのメソッドを呼び出す
クラスは親クラスを継承した後、親クラスのメソッドを直接呼び出すことができます。たとえば、UserInfo2 は親クラス UserInfo を継承し、親クラスの get_account メソッドを直接呼び出すことができます。
#!/usr/bin/env python # -*- coding: UTF-8 -*- class UserInfo(object): lv = 5 def __init__(self, name, age, account): self.name = name self._age = age self.__account = account def get_account(self): return self.__account class UserInfo2(UserInfo): pass if __name__ == '__main__': userInfo2 = UserInfo2('两点水', 23, 347073565); print(userInfo2.get_account())
3. 親クラスのメソッドのオーバーライド
もちろん、親クラスのメソッドをオーバーライドすることもできます。
例:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- class UserInfo(object): lv = 5 def __init__(self, name, age, account): self.name = name self._age = age self.__account = account def get_account(self): return self.__account @classmethod def get_name(cls): return cls.lv @property def get_age(self): return self._age class UserInfo2(UserInfo): def __init__(self, name, age, account, sex): super(UserInfo2, self).__init__(name, age, account) self.sex = sex; if __name__ == '__main__': userInfo2 = UserInfo2('两点水', 23, 347073565, '男'); # 打印所有属性 print(dir(userInfo2)) # 打印构造函数中的属性 print(userInfo2.__dict__) print(UserInfo2.get_name())
最後の出力結果:
これは、書き換えられた親クラスのコンストラクターです。
4. サブクラスの型判定
クラスの継承関係において、クラスの型を判定する必要がある場合があります。
isinstance() 関数を使用できます。
isinstance() 関数の使用法を例で理解できます。
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- class User1(object): pass class User2(User1): pass class User3(User2): pass if __name__ == '__main__': user1 = User1() user2 = User2() user3 = User3() # isinstance()就可以告诉我们,一个对象是否是某种类型 print(isinstance(user3, User2)) print(isinstance(user3, User1)) print(isinstance(user3, User3)) # 基本类型也可以用isinstance()判断 print(isinstance('两点水', str)) print(isinstance(347073565, int)) print(isinstance(347073565, str))
出力結果は次のとおりです:
True True True True True False
isinstance() は、オブジェクトが特定の型であるかどうかを示すだけでなく、基本的な型を判断するためにも使用できることがわかります。種類。