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