python-メソッドもプロパティです
5248 ワード
メソッドも属性
classで定義したインスタンスメソッドも属性であり、実際には関数オブジェクトです.
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
# => >
print p1.get_grade()
# => A
つまりp 1.get_gradeは関数オブジェクトを返すが、この関数はインスタンスにバインドされた関数であり、p 1である.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
インスタンスに動的に追加する方法は一般的ではありません.classで直接定義するほうが直感的です.
タスク#タスク#
属性はstr,intなどの一般的な値オブジェクトであってもよいし、方法であってもよいし、関数であってもよいので、以下のコードの実行結果を見て、p 1を考えてみてください.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()
実行結果
__main__.Person object at 0x00000265ECA28E48>>
A