2017-02-21 64 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