Pythonのオブジェクト指向プログラミング(クラス、インスタンス、データのカプセル化、継承、多型、タイプ()、でisinstance()) - 5

クラスとインスタンス

不動産関連の問題の1定義

  • クラス名は通常、資産計上され
  • フォームは以下のように定義されているclass Student(object):ブラケットの背後学生、いかなる適切なオブジェクトを使用することでない場合、そのクラスの継承を示します。
  • いくつかは、我々が定義することで、クラス属性をバインドする必要があります信じて__init__自己自身のインスタンスを作成するためのポイントであるので、この方法を、メソッドの最初のパラメータは常に自己です。
  • __init__方法、時間内のインスタンスを作成し、あなたがnullのパラメータを渡すことはできません、あなたは合格しなければならない__init__パラメータのマッチング方法を、しかし、自己を渡す必要はありません、自分自身インタプリタPythonは、インスタンス変数に渡します。
  • そして、通常の関数に比べて、クラスで定義された関数で少しだけ異なるが、最初の引数は常にインスタンス変数でありself、そしてあなたが呼び出すときに、このパラメータを渡すことはありません。

2.データパッケージ

  • クラスのプロパティ関数内で定義されたクラスにアクセスすることにより、データをカプセル化。
  • この方法は、関数インスタンスが結合している正常な機能とは異なる、方法は直接データ・インスタンスにアクセスすることができます。
  • そして、静的異なる言語は、Pythonのは、彼らが同じクラスの別のインスタンスであるが、2つのインスタンス変数のために、と言うことです例えば、任意のデータ変数バインディングを、できますが、変数名が異なる場合があります持っています。

第二に、制限アクセス

  1. あなたがプロパティ内部外部からのアクセスは、プロパティの名前に加えて2つのアンダースコアの前に置くことをされていないたい場合は__、Pythonで、インスタンス変数名を場合__最初は、それが(プライベート)プライベート変数となり、唯一の内部にアクセスすることができます、外部からアクセスできない。
  2. あなたが外部コードにアクセスしたい場合は、Studentクラスに増やすことができますget_nameし、get_score外部からのアクセスのための方法。
  3. あなたは、スコアを変更する必要がある場合は、増やすことができますset_name方法を。
  4. 時には、あなたはインスタンス変数名はアンダースコアで始まる表示されます、例えば_name、そのようなインスタンス変数名が利用可能であるが、規定に従ってプライベート変数として扱われます。
  5. インスタンス変数は、必ずしも外部からアクセスされていないされていない2つのアンダースコアで始まりますか?実際には、ありません。直接アクセスすることはできません__name外部のPythonインタプリタため、__name変更変数_Student__nameので、まだできる_Student__nameアクセス__name変数を
  6. Pythonインタプリタの異なるバージョンが異なる変数名に__nameを出してもよいので、しかし、強く、あなたがそれをしないことをお勧めします。全体的には、Pythonは、意識的にすべてのおかげで悪いことをやってからあなたを停止する任意のメカニズムを持っていません。
class Student(object):
    def __init__(self, name, gender):
        self.__name = name
        self.__gender = gender
    
    def get_name(self):
        return self.__name

    def get_gender(self):
        return self.__gender

    def set_gender(self, gender):
        self.__gender = gender


bart = Student('Bart', 'male')
if bart.get_gender() != 'male':
    print('测试失败!')
else:
    bart.set_gender('female')
    if bart.get_gender() != 'female':
        print('测试失败!')
    else:
        print('测试成功!')    

第三に、継承、ポリモーフィズム

  1. 継承の最大の利点は、サブカテゴリー、親クラスのすべての機能にアクセスするために、です。
  2. もちろん、あなたはまた、そのような犬クラスとしてサブクラスのメソッドを、増やすことができます。
  3. 親クラスとサブクラスは親クラスのサブクラスのオーバーライドメソッドのと同じように存在している場合は、コードが実行されている、我々は他の相続の利益を得るようにすることを、常にサブクラスのメソッドの呼び出しがあります:多态
  4. だから、階層で、データ型が、それはまた、親として見ることができるデータの種類のサブクラスのインスタンスである場合。しかし、逆は動作しません。
  5. マルチ状態の利点は、呼び出し側は単に呼び出して、関係なく、細部の、これが有名である开闭原则:拡張のためのオープン:新しい動物のサブクラスを許可し、変更のため閉鎖:動物はrun_twice()および他の機能の種類を変更する必要はありませ依存しています。
  6. 動的言語の言語対静的(Javaなど)の静的型付け言語のために、動物の種類を渡す必要がある場合は、入ってくるオブジェクトがタイプの動物またはそのサブクラスである必要があり、そうでない場合は、あなたが実行を呼び出すことはできません()メソッド; Python用このような動的言語は、あなたが必ずしも動物の種類に渡す必要はありません。私達はちょうど入ってくるオブジェクトがその上にrun()メソッドを持っていることを確認する必要があります。

第四に、オブジェクトの情報を取得します

  1. 使用type()関数は、オブジェクトのタイプを決定するために使用することができます。クラスには、対応する型を返します。
  2. オブジェクトが関数であるかどうかを判断するには、使用することができますtypesモジュールで定義された定数を
  3. 使用するisinstance()クラスの種類を分析します。そしてまた、特定の型の変数か否かを判断し、isinstance([1, 2, 3], (list, tuple)
  4. オブジェクトのプロパティとメソッドを取得するには、使用することができるdir()機能を。ではgetattr()、、 setattr()hasattr()私たちは、直接オブジェクトの状態を操作することができます。
>>> class MyObject(object):
...     def __init__(self):  
...         self.x = 9
...     def power(self):
...         return self.x * self.x
... 
>>> obj = MyObject()
>>> hasattr(obj, 'x')
True
>>> obj.x
9
>>> hasattr(obj, 'y')
False
>>> setattr(obj, 'y', 19)
>>> hasattr(obj, 'y')
True
>>> getattr(obj, 'y')
19
>>> obj.y
19
>>> getattr(obj, 'z')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'MyObject' object has no attribute 'z'
>>> getattr(obj, 'z', 404)
404
>>> hasattr(obj, 'power')
True
>>> getattr(obj, 'power')
<bound method MyObject.power of <__main__.MyObject object at 0x00000224FC11FF60>>
>>> fn = getattr(obj, 'power') 
>>> fn
<bound method MyObject.power of <__main__.MyObject object at 0x00000224FC11FF60>>
>>> fn()
81

V.インスタンスの属性とクラス属性

  1. バインディングプロパティの方法の例は、一例として、または、変数であるself変数。
  2. 場合はStudent、それ自体がプロパティをバインドする必要があるクラスは、クラス内で直接属性を定義することができ、このプロパティは、最終的には、クラス属性であるStudentすべてのクラス。
  3. 同じ名前のインスタンスプロパティはクラス属性をシールドするので、しかし、あなたは、インスタンスの属性を削除すると、その後、同じ名前を使用して、アクセス手続きの準備には、同じ名前のインスタンスの属性とクラス属性のありませんこれは、クラス属性になります

おすすめ

転載: www.cnblogs.com/tsruixi/p/12595147.html
おすすめ