カプセル化
1. なぜカプセル化なのか?
カプセル化とは、データ属性とメソッドの特定の実装の詳細を隠し、インターフェイスのみを提供することです。カプセル化には、オブジェクトの構築方法を考慮する必要はありません
2. カプセル化には、データのカプセル化と関数のカプセル化が含まれます。データのカプセル化は、複雑さを分離するために行われます
3. データのカプセル化は、属性の前にあります。 __
class People:def __init__(self,name,age,salary): self.name=name self.age=age self.__salary=salary p=People('zhang',19,100000)print(p.name)#zhangprint(p.age)#19print(p.__salary)#AttributeError: 'People' object has no attribute '__salary'
エラーが報告されました。オブジェクトの名前空間を開いて何が起こったのか見てみましょう
print(p.__dict__)#{'name': 'zhang', 'age': 19, '_People__salary': 100000}
ああ、Python が __salary を _People__salary に変換したことがわかりました。もう一度実行してください
print(p._People__salary)#100000
したがって、Python には絶対的な非表示はありません。上記のことを理解している限り、非表示にする必要はありません。
これらの変換操作は、クラスの定義フェーズまたはオブジェクト定義 (インスタンス化フェーズ) フェーズでのみ発生します。
__で追加された属性は外部ですが、直接アクセスすることはできませんが、クラス内ではアクセス可能であることがわかりますが、定義段階では__で始まる属性に遭遇すればPythonインタプリタが自動的に認識します。 _class name__ 属性として、クラス内で内部にアクセスできるので、いくつかの小さなことを行うことができますまずこれを見てみましょうclass A:def foo(self):print('from A foo') self.bar()def bar(self):print('from A bar')class B(A):def bar(self):print('from B bar') b=B() b.foo() #from A foo
#from B bar 别想多了,调用函数时别看定义位置,要看调用位置
class A:def foo(self):print('from A foo') self.__bar()def __bar(self):print('from A bar')class B(A):def __bar(self):print('from B bar') b=B() b.foo() #from A foo#from A bar 有没有感受到编程的享受
class People:def __init__(self,name,age,height,weight,hobby): self.__name=name self.__age=age self.__height=height self.__weight=weight self._hobby=hobbydef tell_info(self):print('''name:%s age:%s height:%s weeight:%s'''%(self.__name,self.__age, self.__height,self.__weight)) p=People('zhang',18,1.90,75,'read') p.tell_info()
def tell_name(self):print(self.__name)#修改名字def set_name(self,new):if not isinstance(new,str):raise TypeError('名字必须是字符串类型') self.__name=new
以上がPythonオブジェクト指向の知識まとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。