第二十四章:パッケージ、マルチステート、継承

22806 ワード

パッヶージ
パッケージとは何か
外部に内部の属性を非表示にし、詳細を実装し、外部に使用するインタフェースを提供します.
注意:パッケージには隠す意味がありますが、単純に隠すわけではありません
学習パッケージの目的外部からの内部データへのアクセスを制限できるようにするためです
pythonのプロパティの権限は2つに分けられます
1.公開
誰でもアクセスできる制限はありません
2.プライベート
現在のクラス自体のみがアクセス可能
デフォルトは共通
 
パッケージ化方法
.................
なぜwhyをカプセル化するの?
1.セキュリティの向上
パッケージ属性
2.分離の複雑さ
パッケージング方法
 
 
 
クラスには2つのデータ、属性、メソッドがあります.
パッケージのプロパティ:
class Student:

   def __init__(self,name,age,gender,id_card):
       self.name = name
       self.age = age
       self.gender = gender
       self.__id_card = id_card

   def show_id_card(self):
       #
       
       #
       print(self.__id_card)

プライベート属性へのアクセスと変更
class Student:
   def __init__(self,name,age,gender,id_card):
       self.name = name
       self.age = age
       self.gender = gender
       self.__id_card = id_card

   #
   def get_id_card(self,pwd):
       #
       #
       if pwd =="123":
           return self.__id_card
       raise Exception(" !")


   #  
   def set_id_crad(self,new_id):
       #
       # 18
       if isinstance(new_id,str) and len(new_id) == 18:
           self.__id_card = new_id
       else:
           raise Exception(" 18!")

どのような方法でカプセル化されるべきか
外部に直接アクセスさせるべきではない内部サポート方法は、次の例のuser_authなど...
class ATM:

   def withdraw(self):
       self.__user_auth()
       self.__input_money()
       self.__save_record()
       #
       #
       #
       #

   def __user_auth(self):
       print(" ....")

   def __input_money(self):
       print(" 100000000, !")

   def  __save_record(self):
       print(" ....")

パッケージの原理:
python               
_ _Person__id_card


 
いつwhereを使いますか.
パッケージ属性
このオブジェクトに機密性のある属性、例えば人の身分証明書の銀行カードのパスワードなどが存在する場合、属性は外部から直接アクセスされるべきではない.
PersonパスワードTeacher給与
パッケージング方法
外部に直接アクセスさせるべきではない内部サポート方法は、次の例のuser_authなど..
 
Property
≪アクション|Action|oraolap≫:メソッドを通常のプロパティに偽装します.
なぜpropertyでプライベート属性と一般属性にアクセスする方法を一致させたいのか
propertyに関連する2つの装飾器
setter
ポイント構文で属性に値を割り当てるとトリガーされます
deleter
ポイント構文で属性を削除するとトリガーされます
ケース:
class Teacher:
   def __init__(self,name,age,salary):
       self.name = name
       self.age = age
       self.__salary = salary

   @property  # getter   #  
   def salary(self):
       return self.__salary

   @salary.setter   #
   def salary(self,new_salary):
       self.__salary = new_salary

   @salary.deleter #
   def salary(self):
       # print("can not delete salary!")
       del self.__dict__["_Teacher__salary"]

 
propertyのもう一つのシーン計算プロパティの使用
何が属性を計算しますか1つの属性その値は固定的ではありませんて死んだのではありませんて、動的に発生するBMIを計算します
class Person:
   def __init__(self,name,height,weight):
       self.name = name
       self.height = height
       self.weight = weight
       # self.BMI = weight / (height ** 2)

   @property
   def BMI(self):
       return self.weight / (self.height ** 2)

   @BMI.setter
   def BMI(self,new_BMI):
       print("BMI .....")


p = Person("egon",1.7,80)
print(p.BMI)
p.BMI = 10

マルチステート:
マルチステートは特定のテクノロジーまたはコードではありません
複数の異なるタイプのオブジェクトが同じメソッドに応答して異なる結果を生成できることを意味します.
  

:  
    :
    :

OOP :

:
  ,    
 
   
  person cat pig

:

ケース:
class Cat():
   def bark(self):
       print(" ")
   def run(self):
       print(" !")
   def sleep(self):
       print(" !")
       
class Pig():
   def bark(self):
       print(" !")
   def run(self):
       print(" !")
   def sleep(self):
       print(" !")

#  
def management_animal(animal):
   print("================== %s=============" % animal.__class__.__name__)
   animal.bark()
   animal.run()
   animal.sleep()

 
パッヶージ
パッケージ*****とは
パッケージのメリット*****カプセル化方法
パッケージの原理
property    *****
setter  deleter  
計算プロパティ
マルチステート:
マルチステートとは、複数の異なるタイプのオブジェクトが同じ方法に応答して異なる結果を生成できることを意味する*****メリット*****
  :                    ,                                     


person cat pig

多態アヒルのタイプを実現する方法
 
 
 
 
 
一般的な組み込み関数
  __str__
  __del__
"""
__del__

?
  1.
  2. del

:


,




 
 
 


:__del__
"""
# person
class Person:
   def __init__(self,name,path,mode="rt",encoding="utf-8"):
       self.name = name
       self.file = open(path,mode,encoding=encoding)



   #
   def read_data(self):
       return self.file.read()


   def __del__(self):
       print("del run!")
       self.file.close()

 
はんしゃ
英語では反省と言います(自省)
オブジェクト向けの反省とは、1つのオブジェクトが自分の属性を発見し、自分の属性を修正する能力を備えなければならないことを指す.  
オブジェクトは設計の初期に、既存のプロパティを削除または変更し、プロパティを追加する必要がある場合があります.
反射とは、文字列によってオブジェクトのプロパティを操作することです.
 
 
関連する方法:
hasattr           

getattr

setattr

delattr

ケース:
class MY_CMD:

   def dir(self):
       os.system("dir")

   def ipconfig(self):
       os.system("ipconfig")

cmd = MY_CMD()

while True:
   name = input(" :")
   if hasattr(cmd,name):
       method = getattr(cmd,name)
       print(method)
       method()
   else:
       print("sorry this method is not exists....!")

 
ダイナミックインポートモジュール
"""
import :

import importlib
mk = importlib.import_module(m_name)
mk
"""

 
 
 
 
 
 
 
転載先:https://www.cnblogs.com/haojunliancheng/p/10896381.html