ホームページ  >  記事  >  バックエンド開発  >  Pythonオブジェクト指向の知識まとめ

Pythonオブジェクト指向の知識まとめ

巴扎黑
巴扎黑オリジナル
2017-07-23 13:44:411761ブラウズ

カプセル化

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  别想多了,调用函数时别看定义位置,要看调用位置
親クラスの 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  有没有感受到编程的享受
4. カプセル化されたアプリケーション

1) データ属性がどのように定義されているかを外部に公開しないでください。当社が提供するインターフェイスを通じて外部に参照できるもののみを確認できます。

2) より一般的なシナリオは、データの種類を制限し、独自のロジックを追加して、それをユーザー向けにカプセル化することです
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()

5。上記の操作を見ると、ユーザーは依然として p する必要があります。 name.tell_name() は元々データ属性でしたが、組み込み関数プロパティを使用できるようにするにはどうすればよいですか
    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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。