2014-12-18 43 views
1

我想使用@classmethod,但我不想用它污染實例的命名空間。如果我有一個類方法for_classes_only,我該如何阻止實例獲取它?不想讓實例看到Python @classmethod

class MyThing(object): 
    def __init__(self, this=None): 
     self.this = this 

    @classmethod 
    def for_classes_only(cls): 
     print "I have a class {}".format(cls) 


thing = MyThing(this='that') 

這是偉大的:

>>> MyThing.for_classes_only() 
I have a class <class '__main__.MyThing'> 

這是煩人:

>>> thing.for_classes_only 
<bound method type.for_classes_only of <class '__main__.MyThing'>> 
+5

*一個類上的所有*都可以在實例上訪問。它不*活*,它是當實例本身不存在屬性時Python會查看類。如果你不想讓實例看到它,可以在類之外使用一個函數*。當然你必須明確地傳入類,因爲它不會被綁定。 – 2014-12-18 22:18:07

+0

所以「類方法」僅僅意味着該方法接收該類,而不是該方法僅限於該類。得到它了。 – jkmacc 2014-12-18 22:30:29

+0

您無法隱藏它,但可以根據類是否已實例化來改變其行爲,例如,通過在'__init__'中設置一個標誌。 – 101 2014-12-18 23:07:36

回答

2

嘗試使用metaclass

class Meta(type): 
    # There is *NO* @classmethod decorator here 
    def my_class_method(cls): 
     print "I have a class {}".format(cls) 

class MyThing(object): 
    __metaclass__ = Meta 
    def __init__(self, this=None): 
     self.this = this 

這是較重的魔法比大多數人需要或想要,所以只有這樣做如果你真的很確定你需要它。大多數情況下,正常的@classmethod就足夠了。

+0

你是對的,這是一個煩人的矯枉過正。但它完成了這項工作:-)我碰巧正在使用一個元類,所以這很好。謝謝! – jkmacc 2014-12-19 16:42:59