2017-02-21 22 views
-1

Предположим, что у меня есть класс:Python набор переопределения метаклассом атрибут

class ABC: 
    pass 

И я:

ABC.x = 123 

Это не дает мне сообщение об ошибке, даже если я не создал объект. Какой из методов __func__ вызывается и как его переопределить?

+0

Вы установка атрибута на объект класса. Так вызывается '__setattr__', но он вызывается в метаклассе. Посмотрите метаклассы, чтобы получить представление о том, для чего вы находитесь. – BrenBarn

+0

@BrenBarn спасибо за совет, я сделаю это в ближайшее время. Однако, чтобы решить мою непосредственную проблему, не возражаете ли вы дать ответ? :) –

+0

Вы используете Python 2 или Python 3? – BrenBarn

ответ

1

Вам необходимо определить метакласс и переопределить __setattr__, а затем сделать свой класс используемым метаклассом.

class Meta(type): 
    def __new__(meta, name, bases, attrs): 
     return super().__new__(meta, name, bases, attrs) 

    def __setattr__(cls, attr, value): 
     print("I am setting {}.{} = {}".format(cls.__name__, attr, value)) 
     return super().__setattr__(attr, value) 

class Foo(metaclass=Meta): 
    pass 

Тогда:

>>> Foo.blah = 2 
I am setting Foo.blah = 2 
>>> Foo.blah 
2