オブジェクト指向
カテゴリ
カテゴリーは、機能的に同様のアセンブリであります
オブジェクト
オブジェクトは、クラスの特定の個人が具体化されています
3つの物事が起こるオブジェクトをインスタンス化します
- メモリ空間内のオブジェクトを作成します。
- 自動的に実行する
__init__
自己の方法、およびターゲットアドレスを - 実行
__init__
パッケージのオブジェクト空間に、内部そのプロパティをメソッドコード
自己
位置パラメータ、受信側オブジェクトのアドレス
空間構造
オブジェクトクエリの属性:クラス空間オブジェクト・スペース---- ----親
---クラスの親クラスのスペース:クラス属性を照会
ローカルおよび一貫したグローバル
電源のそれでも、唯一のオブジェクトクラス属性を使用する権利、ノー削除、修正
クラスとクラス間の関係
依存関係
クラスまたはオブジェクトのクラス名の方法は、別のクラスに渡されます。
## 依赖关系 class Elephant: def __init__(self,name): self.name = name def open(self,obj): print(f"{self.name}打开了{obj.name}冰箱") obj.open_door() def close(self,obj): print(f"{self.name}关闭了{obj.name}冰箱") obj.close_door() class Refrigerator: def __init__(self,name): self.name = name def open_door(self): print(f"{self.name}被打开了") def close_door(self): print(f"{self.name}被关闭了") e1 = Elephant('冰河') b1 = Refrigerator('火') e1.open(b1) e1.close(b1)
関係の組み合わせ
オブジェクトクラス属性は、別のクラスのオブジェクトにカプセル化されます
## 组合关系 class Boy: def __init__(self,name): self.name = name def meet(self,girl=None): self.girl_friend = girl def have_dinner(self): print(f"{self.name}和{self.girl_friend.name}共进晚餐") self.girl_friend.shopping(self) class Girl: def __init__(self,name,age): self.name = name self.age = age def shopping(self,obj): print(f"{obj.name}和{self.name}一起去购物") yu = Boy('yu') en = Girl('en',22) yu.meet(en) yu.have_dinner() #en.shopping(yu)
依存組み合わせプラス
class GameRole: def __init__(self,name,hp,ad): self.name = name self.hp = hp self.ad = ad def equip_weapon(self,obj): self.wea_attack = obj def attack(self,obj): obj.hp-=self.ad print (f"{self.name}攻击了{obj.name},{obj.name}还剩下{obj.hp}滴血") class Weapon: def __init__(self,name,att_value): self.name = name self.att_value = att_value def weapon(self,obj1,obj2): obj2.hp = obj2.hp-obj1.ad-self.att_value print (f"{obj1.name}使用{self.name}攻击了{obj2.name},{obj2.name}还剩下{obj2.hp}滴血") ys = GameRole('亚索',2000,200) jie = GameRole('劫',1800,220) wj = Weapon('无尽之刃',70) ys.equip_weapon(wj) ys.wea_attack.weapon(ys,jie)
継承
受け継ぎます
- あなたは、親クラスのすべてのメソッドとプロパティを使用することができます
- 継承の利点:結合を強化するために、コードを保存するには、コードをより標準化されます
- 継承短所:あまりにもカップリングには、コードの変更を助長されていません
- 単一継承:一つだけの親
- 多重継承:親クラスの複数の、連続の順序、順序MROに従って(クラス名は直接MROポイントを使用することができます())
如计算merge( [E,O], [C,E,F,O], [C] )
有三个列表 : ① ② ③
merge不为空,取出第一个列表列表①的表头E,进行判断
各个列表的表尾分别是[O], [E,F,O],E在这些表尾的集合中,因而跳过当前当前列表
取出列表②的表头C,进行判断
C不在各个列表的集合中,因而将C拿出到merge外,并从所有表头删除
merge( [E,O], [C,E,F,O], [C]) = [C] + merge( [E,O], [E,F,O] )
进行下一次新的merge操作 ......
---------------------
アヒルモデル
アヒルは、アヒルのように見えます
二つのクラスの間に関係がない限り、機能が類似し、一貫性のあるメソッド名があるように、これは非常に使いやすいでしょう
正規化処理
一緒に制約の正規化とクラスメソッドの例
class Pay:
def pay(self,money):
raise NotImplementedError('sb 重写我')
class Qqpay(Pay):
def pay(self,money):
print(f'使用qq支付{money}')
class Alipay(Pay):
def pay(self,money):
print(f'使用支付宝支付{money}')
class Wechat(Pay):
def fuqian(self,money):
print(f"使用微信支付{money}")
# def pay(self,money):
# print(f"使用微信支付{money}")
def pay(obj,money):
obj.pay(money)
p1 = Alipay()
p2 = Qqpay()
p3 = Wechat()
pay(p1,100)
pay(p2,200)
pay(p3,300) #### 这里会报错
## 为了方便使用,相似的功能使用一种方法名,为了统一调用,使用def pay()统一接口
## 强制归一化,如果父类的pay方法不重写,那么执行pay传入对象就会报错
# 这种比较推荐
第2の制約
from abc import abstractmethod,ABCMeta
class Pay(metaclass=ABCMeta):
@abstractmethod
def pay(self,money):
...
class Qqpay(Pay):
def pay(self,money):
print(f'使用qq支付{money}')
class Alipay(Pay):
def pay(self,money):
print(f'使用支付宝支付{money}')
class Wechat(Pay):
def fuqian(self,money):
print(f"使用微信支付{money}")
# def pay(self,money):
# print(f"使用微信支付{money}")
def pay(obj,money):
obj.pay(money)
p1 = Alipay()
p2 = Qqpay()
p3 = Wechat() ## 这里就会报错
pay(p1,100)
pay(p2,200)
pay(p3,300)
## 使用java中抽象类的概念,个人理解,这样不太好,违背了python的包容性强的设计理念
スーパー
スーパー(A、自己)は、クラスに依存し、自己に応じて、リストMRO方法で次の項目を返します。
名前空間
すべてすべての名前空間のpythonで、限り(関係を含む)、階層的な関係があるので、小規模な名前空間のすべての変数の名前空間の広い範囲を使用する力を持っていませんが、修正するための何の力
そして、オーダーのすべての値は、自分自身を開始するために探して、その後、範囲を拡大しています
突然考えた:オープンスペースで同じメモリを、我々は唯一の使用、使用することを指すの電力変数名の助けを必要としない、および変更する権限、つまり、メモリのオープンスペースは、変数名を変更し、変更することはできません唯一の新しいオープンスペースに、変数名にスペースを開くために値