2014-11-20 4 views
1

Можно добавить метод к классу питона с:Добавить @property метод класса

class foo(object): 
    pass 

def donothing(self): 
    pass 

foo.y = donothing 

Тогда можно было бы назвать метод с:

f = foo() 
f.y() 

Есть ли способ, чтобы добавить @property к def, а также, так что называть его

f.y 

?

ответ

1

Вы можете просто добавить @property до определения метода

... class Foo(object): 
... pass 
... 
>>> @property 
... def bar(self): 
...  print("bar is called") 
... 
>>> Foo.bar = bar 
>>> f = Foo() 
>>> f.bar 
bar is called 
4

Присвоить возвращаемое значение property:

>>> class foo(object): 
...  pass 
... 
>>> def donothing(self): 
...  print('donothing is called') 
... 
>>> foo.y = property(donothing) # <---- 
>>> f = foo() 
>>> f.y 
donothing is called 
0

Абсолютно, он может быть определен как:

class foo(object): 
    def __int__(self): 
     self._y = None 

    @property 
    def y(self): 
     return self._y 

    @y.setter 
    def y(self, value): 
     self._y = value 



>>>>x = foo() 
>>>>x.y = str 
>>>>print type(x.y(12.345)), x.y(12.345) 
<type 'str'> 12.345 

Здесь, я просто говорю, что атрибут у (да атрибут, а не метод!), устанавливается в значение. Поскольку все является объектом в Python, я могу отлично назначить функцию переменной. Метод, связанный с атрибутом y (там как свойство), возвращает значение атрибута, которое превращается в функцию (str в этом случае). Возвращаемое значение используется как вызываемый, что мы и ожидали. Хотя доступ к атрибуту у возвращается как вызываемым, эффективно называя ул()

Я могу назначить любую fucntion к у так:

def double(x): 
    return 2 * x 

... 

>>>>x.y = double 
>>>>print x.y(33) 
66 

И так далее ...

+2

OP не сказал, что 'donothing' был методом' foo'. – Manhattan

Смежные вопросы