Я пытаюсь создать декоратор python, который добавляет атрибуты методам класса, чтобы я мог получать и изменять эти атрибуты из самого метода. Код декоратораPython: Установить атрибут метода из метода
from types import MethodType
class attribute(object):
def __init__(self, **attributes):
self.attributes = attributes
def __call__(self, function):
class override(object):
def __init__(self, function, attributes):
self.__function = function
for att in attributes:
setattr(self, att, attributes[att])
def __call__(self, *args, **kwargs):
return self.__function(*args, **kwargs)
def __get__(self, instance, owner):
return MethodType(self, instance, owner)
retval = override(function, self.attributes)
return retval
Я попробовал этот декоратор на следующем примере игрушек.
class bar(object):
@attribute(a=2)
def foo(self):
print self.foo.a
self.foo.a = 1
Хотя я могу получить доступ к значению атрибута «а» внутри Foo(), я не могу установить его на другое значение. Действительно, когда я звоню bar().foo()
, я получаю следующее свойство AttributeError.
AttributeError: 'instancemethod' object has no attribute 'a'
Почему это? Что еще более важно, как я могу достичь своей цели?
Редактировать
Просто чтобы быть более точным, я пытаюсь найти простой способ реализации статической переменной, которые расположены в пределах методов класса. Продолжая из приведенного выше примера, я хотел бы создать экземпляр b = bar()
, назовите оба метода foo()
и doo()
, а затем получите доступ к b.foo.a
и b.doo.a
.
class bar(object):
@attribute(a=2)
def foo(self):
self.foo.a = 1
@attribute(a=4)
def doo(self):
self.foo.a = 3
Мне было интересно, что такое прецедент такой конструкции? Поскольку вы хотите установить этот атрибут, почему бы не сделать его аргументом foo? – brainovergrow
@brainovergrow, целью является сделать что-то эквивалентное статическим переменным в C++. – Francis