1、Pythonの例示的な方法は、で定義されています
一つの例は、__プロパティで開始するには私有財産である、これらの属性が使用されるかを定義することを、外部からアクセスすることができませんか?
私有財産は、外部からアクセスすることはできませんが、しかし、内からクラスがアクセス可能です。インスタンス属性に加えて定義することができるでは、本方法はまた、インスタンスを定義することができます。
この方法の例は、最初の引数で定義された関数のクラス、メソッド自体呼び出しの例を指し、必ずしも他のパラメータ自己であると一般的な機能は全く同じです。
class Person(object):
def __init__(self, name):
self.__name = name
def get_name(self):
return self.__name
get_name(self)
インスタンスメソッドで、最初のパラメータは自己です。
__init__(self, name)
実際には、特別なインスタンスメソッドとして見ることができます。
インスタンスで呼び出されなければならないインスタンスメソッドを呼び出します。
p1 = Person('Bob')
print p1.get_name() # self不需要显式传入
# => Bob
メソッドの内部の例としては、属性のすべてのインスタンスは、メソッドを呼び出すことによって取得することができ私有財産への外部アクセスを必要に応じてそう、データのカプセル化のこの形式に加えて、内部データの整合性を保護することが、また、外部コールの難しさを簡素化し、アクセスすることができます。
タスク:
Personクラス__scoreプライベート属性に増加、スコアを表し、その後インスタンスメソッドget_gradeを(追加)は、__scoreは優れたA-、B-パスである応じた値を返すことができ、第3ギアを失敗しますC-。
コード:
class Person(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def get_grade(self):
if self.__score >=80:
return 'A'
if self.__score >=60:
return 'B'
return 'C'
p1 = Person('Bob', 90)
p2 = Person('Alice', 65)
p3 = Person('Tim', 48)
print p1.get_grade()
print p2.get_grade()
print p3.get_grade()
2、Pythonのメソッド属性があります
私たちが実際に属性クラスで定義されたメソッドの例としては、それは実際には関数オブジェクトであります:
class Person(object):
def __init__(self, name, score):
self.name = name
self.score = score
def get_grade(self):
return 'A'
p1 = Person('Bob', 90)
print p1.get_grade
# => <bound method Person.get_grade of <__main__.Person object at 0x109e58510>>
print p1.get_grade()
# => A
言い換えれば、p1.get_grade
リターンは関数オブジェクトですが、この機能は、インスタンスにバインドされた機能であるp1.get_grade()
メソッドの呼び出しです。
方法は財産であるので、それを動的にインスタンスに追加することができますので、ちょうど必要性types.MethodType()
の方法には、関数となります:
import types
def fn_get_grade(self):
if self.score >= 80:
return 'A'
if self.score >= 60:
return 'B'
return 'C'
class Person(object):
def __init__(self, name, score):
self.name = name
self.score = score
p1 = Person('Bob', 90)
p1.get_grade = types.MethodType(fn_get_grade, p1, Person)
print p1.get_grade()
# => A
p2 = Person('Alice', 65)
print p2.get_grade()
# ERROR: AttributeError: 'Person' object has no attribute 'get_grade'
# 因为p2实例并没有绑定get_grade
動的に追加する方法の一例は、直接クラスに定義するために、より直感的ではないが一般的です。
タスク:
プロパティの値は、この方法でも関数であってもよいことができ、などSTR、INT、等の通常のオブジェクトとすることができるので、我々は方法の関数ではないのはなぜp1.get_gradeについて考えてください、次のコードの結果を見てみましょう。
class Person(object):
def __init__(self, name, score):
self.name = name
self.score = score
self.get_grade = lambda: 'A'
p1 = Person('Bob', 90)
print p1.get_grade
print p1.get_grade()