クラスとインスタンス
不動産関連の問題の1定義
- クラス名は通常、資産計上され
- フォームは以下のように定義されている
class Student(object):
ブラケットの背後学生、いかなる適切なオブジェクトを使用することでない場合、そのクラスの継承を示します。
- いくつかは、我々が定義することで、クラス属性をバインドする必要があります信じて
__init__
自己自身のインスタンスを作成するためのポイントであるので、この方法を、メソッドの最初のパラメータは常に自己です。
__init__
方法、時間内のインスタンスを作成し、あなたがnullのパラメータを渡すことはできません、あなたは合格しなければならない__init__
パラメータのマッチング方法を、しかし、自己を渡す必要はありません、自分自身インタプリタPythonは、インスタンス変数に渡します。
- そして、通常の関数に比べて、クラスで定義された関数で少しだけ異なるが、最初の引数は常にインスタンス変数であり
self
、そしてあなたが呼び出すときに、このパラメータを渡すことはありません。
2.データパッケージ
- クラスのプロパティ関数内で定義されたクラスにアクセスすることにより、データをカプセル化。
- この方法は、関数インスタンスが結合している正常な機能とは異なる、方法は直接データ・インスタンスにアクセスすることができます。
- そして、静的異なる言語は、Pythonのは、彼らが同じクラスの別のインスタンスであるが、2つのインスタンス変数のために、と言うことです例えば、任意のデータ変数バインディングを、できますが、変数名が異なる場合があります持っています。
第二に、制限アクセス
- あなたがプロパティ内部外部からのアクセスは、プロパティの名前に加えて2つのアンダースコアの前に置くことをされていないたい場合は
__
、Pythonで、インスタンス変数名を場合__
最初は、それが(プライベート)プライベート変数となり、唯一の内部にアクセスすることができます、外部からアクセスできない。
- あなたが外部コードにアクセスしたい場合は、Studentクラスに増やすことができます
get_name
し、get_score
外部からのアクセスのための方法。
- あなたは、スコアを変更する必要がある場合は、増やすことができます
set_name
方法を。
- 時には、あなたはインスタンス変数名はアンダースコアで始まる表示されます、例えば
_name
、そのようなインスタンス変数名が利用可能であるが、規定に従ってプライベート変数として扱われます。
- インスタンス変数は、必ずしも外部からアクセスされていないされていない2つのアンダースコアで始まりますか?実際には、ありません。直接アクセスすることはできません
__name
外部のPythonインタプリタため、__name
変更変数_Student__name
ので、まだできる_Student__name
アクセス__name
変数を
- 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('测试成功!')
第三に、継承、ポリモーフィズム
- 継承の最大の利点は、サブカテゴリー、親クラスのすべての機能にアクセスするために、です。
- もちろん、あなたはまた、そのような犬クラスとしてサブクラスのメソッドを、増やすことができます。
- 親クラスとサブクラスは親クラスのサブクラスのオーバーライドメソッドのと同じように存在している場合は、コードが実行されている、我々は他の相続の利益を得るようにすることを、常にサブクラスのメソッドの呼び出しがあります:
多态
- だから、階層で、データ型が、それはまた、親として見ることができるデータの種類のサブクラスのインスタンスである場合。しかし、逆は動作しません。
- マルチ状態の利点は、呼び出し側は単に呼び出して、関係なく、細部の、これが有名である
开闭原则
:拡張のためのオープン:新しい動物のサブクラスを許可し、変更のため閉鎖:動物はrun_twice()および他の機能の種類を変更する必要はありませ依存しています。
- 動的言語の言語対静的(Javaなど)の静的型付け言語のために、動物の種類を渡す必要がある場合は、入ってくるオブジェクトがタイプの動物またはそのサブクラスである必要があり、そうでない場合は、あなたが実行を呼び出すことはできません()メソッド; Python用このような動的言語は、あなたが必ずしも動物の種類に渡す必要はありません。私達はちょうど入ってくるオブジェクトがその上にrun()メソッドを持っていることを確認する必要があります。
第四に、オブジェクトの情報を取得します
- 使用
type()
関数は、オブジェクトのタイプを決定するために使用することができます。クラスには、対応する型を返します。
- オブジェクトが関数であるかどうかを判断するには、使用することができます
types
モジュールで定義された定数を
- 使用する
isinstance()
クラスの種類を分析します。そしてまた、特定の型の変数か否かを判断し、isinstance([1, 2, 3], (list, tuple)
- オブジェクトのプロパティとメソッドを取得するには、使用することができる
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.インスタンスの属性とクラス属性
- バインディングプロパティの方法の例は、一例として、または、変数である
self
変数。
- 場合は
Student
、それ自体がプロパティをバインドする必要があるクラスは、クラス内で直接属性を定義することができ、このプロパティは、最終的には、クラス属性であるStudent
すべてのクラス。
- 同じ名前のインスタンスプロパティはクラス属性をシールドするので、しかし、あなたは、インスタンスの属性を削除すると、その後、同じ名前を使用して、アクセス手続きの準備には、同じ名前のインスタンスの属性とクラス属性のありませんこれは、クラス属性になります