1.コンテンツ今日
- オブジェクト指向の3つのプロパティ:カプセル化、継承、ポリモーフィズム
- 何を継承していますか?
- 継承の利点
- 単一継承、多重継承
- 制約クラス
- スーパー深い理解
2.具体内容
オブジェクト指向の3つのプロパティ:カプセル化、継承、ポリモーフィズム
パッケージ
- 何かの内容は場所に取り付けられており、取り出すことができます
- クラスには、静的プロパティのsetメソッドを設定します
- オブジェクト、属性は、そのオブジェクト空間に包装することができます
ポリモーフィズム
- 事は様々な形態を生み出します
- 各種ステータスのデータ構造。リストにコピーすることができる変数は、文字列に割り当てることができるような
- 備考:このようC ++やJavaなどの言語では、変数の定義は、事前に変数の型を宣言する必要があります、それ以外の場合はエラーになります
継承
何を継承していますか?
- 専門的見地:クラスAを継承Bは、BがAのサブクラスで、派生クラス、B A親基底クラスと呼ばれる、スーパークラスと呼ばれています
- サブクラスは、親クラスのすべてのメソッドとプロパティを呼び出すことができます
継承の利点
- 保存コード
- 強化されたカップリング
- コードの規範
単一継承、多重継承
単一継承:一つだけの親
- 親クラスからクラス名の属性とメソッドが実行します
- オブジェクトから親クラスの属性とメソッドの実行
class Animal(): live = '有生命的' def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def eat(self): print(f'self-->{self}') print('动物都需要吃饭') class Person(Animal): pass print(Person.__dict__) print(Person.live) Person.eat('xxx') p1 = Person('jik',18,'boy') print(p1.live) p1.eat() print(f'p1-->{p1}') Person.live = 'xxx' print(Person.live)
出力:
{'__module__': '__main__', '__doc__': None} 有生命的 self-->xxx 动物都需要吃饭 有生命的 self--><__main__.Person object at 0x104634ac8> 动物都需要吃饭 p1--><__main__.Person object at 0x104634ac8> xxx
リマーク:
- サブクラスとサブクラスオブジェクトは、(追加、削除)操作することができない、親クラスの属性とメソッドを呼び出すことができます
- 同じ名前の子と親クラスのメソッドは、親クラスは「カバー」のサブクラスになるとき
class Animal(): live = '有生命的' def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def eat(self): print(f'self-->{self}') print('动物都需要吃饭') class Person(Animal): def eat(self): print('人类需要吃饭') p1 = Person('jik',18,'boy') p1.eat()#人类需要吃饭
リマーク:
- 同じオブジェクトの参照「最も近い」原則、および単一順次不可逆性を満たすシス
方法サブクラスを行う親クラス及びメソッドは、「塩」オブジェクト・クラスの同じ名前の方法で必要とされる場合ニーズが直ちに実行されます
- 解決策は2つあります
class Animal(): live = '有生命的' def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def eat(self): print(f'self-->{self}') print('动物都需要吃饭') class Person(Animal): def __init__(self,name,age,sex,hobby): #方法一: Animal.__init__(self,name,age,sex) #方法二: super(Person,self).__init__(name,age,sex) super().__init__(name,age,sex) self.hobby = hobby def eat(self): print('人类都需要吃饭') super().eat() p1 = Person('jik',18,'boy','打球') p1.eat() 人类都需要吃饭 self--><__main__.Person object at 0x10d0d7b00> 动物都需要吃饭
多重継承:二つ以上の親クラスの存在
- クラシック:すべての親クラスのオブジェクトを継承していない、深さ優先のアルゴリズムは、クエリルールに基づいています
- 以前のバージョンのpython2.2
- 新しいクラス:デフォルト継承するすべての親クラスのオブジェクト、クエリルールがMROアルゴリズム(トポロジカルソート)の基礎
- Python3.0以降
- 共存:
- 〜2.7バージョンのpython2.2
- クラシック:すべての親クラスのオブジェクトを継承していない、深さ優先のアルゴリズムは、クエリルールに基づいています
制約クラス
- アヒルの種類:2つの別々のクラスは、同じ同様の機能が命名され、Pythonは二つのクラスにそれぞれ他のアヒルのカテゴリを言って、これらの機能の統一を可能仕様の階で展開されます。
class Str: def index(self): pass def count(self): pass class list: def index(self): pass def count(self): pass
制約クラス:例外はクラスやメソッドの不規則に投げ込まれ、コーディング統一、標準化の開発
最初の方法:昇給
class Payment: def pay(self,money): #约定俗称定义一种规范,子类要定义pay方法 raise Exception('子类必须定义此方法') class QQpay(Payment): def pay(self,money): print(f'利用qq支付了{money}') class Alipay(Payment): def pay(self,money): print(f'利用支付宝支付了{money}') class Wechatpay(Payment): def pay(self,money): print(f'利用微信支付了{money}') ///////////////////////////////// /def fukuan(self,money): / / print(f'利用微信支付了{money}') / def pay(obj,money): obj.pay(money) obj = Wechatpay() pay(obj,300) obj.fukuan(300)#报错(‘子类必须定义此方法’)
第二の方法:ABCの固定型固定方法を導入し、固定
from abc import ABCMeta, abstractmethod class Payment(metaclass=ABCMeta): @abstractmethod def pay(self, money): pass class QQpay(Payment): def pay(self, money): print(f'利用qq支付了{money}') class Alipay(Payment): def pay(self, money): print(f'利用支付宝支付了{money}') class Wechatpay(Payment): def fuqian(self,money): print(f'利用微信支付了{money}') obj3 = Wechatpay()
出力:
报错("Can't instantiate abstract class Wechatpay with abstract methods pay")
スーパー深い理解
- スーパー()メソッドは、親クラスを行う2つのパラメータをブラケット、最初のパラメータは、任意の配列MROオブジェクトは(現在のクラス名を含む)一つの要素に配置され、2番目のパラメータは、自己であり、それはこのMROを実行します次のクラスの配列、最初のパラメータ(複数可)
class A: def f1(self): print('in A') class Foo: def f1(self): print('in B') class Bar(A): def f1(self): print('in Bar') calss Info(Foo,Bar): def f1(self): super(Info,self).f1() super(Foo,self).f1() super(Bar,self).f1() print('in Info f1') obj = Info() print(Info.mro()) obj.f1()
出力:
[<class '__main__.Info'>, <class '__main__.Foo'>, <class '__main__.Bar'>, <class '__main__.A'>, <class 'object'>] in B in Bar in A in Info f1