2010-08-13 216 views
10

我正在爲一個項目編寫Blender的Python腳本,但我對這個語言很陌生。我感到困惑的是靜態變量的使用。下面是一段代碼,我目前的工作:Python中的靜態變量繼承

class panelToggle(bpy.types.Operator): 
    active = False 

    def invoke(self, context, event): 
     self.active = not self.active 
     return{'FINISHED'} 

class OBJECT_OT_openConstraintPanel(panelToggle): 
    bl_label = "openConstraintPanel" 
    bl_idname = "openConstraintPanel" 

的想法是,第二類應該繼承活躍變量和從第一調用方法,使呼叫OBJECT_OT_openConstraintPanel.invoke( )改變了OBJECT_OT_openConstraintPanel.active。使用self正如我以上所做的那樣不起作用,並且也不使用panelToggle來代替。任何想法我如何去做這件事?

+0

好吧,看來我可以用self.__class__.active或類型(個體經營)。主動讓方法繼承正常。謝謝! – gibberish 2010-08-13 09:52:46

+0

爲什麼你首先使用靜態變量?這似乎不明智。這是'active'屬性的某種全局性,在所有'PanelToggle'實例中共享?如果是這樣,爲什麼它不是全球性的?或者爲什麼不在一些更全局的共享對象? – 2010-08-13 10:09:50

+0

我希望每個panelToggle子類都有自己的「活動」變量,可以在不創建實例的情況下訪問它。如果我正確理解使用「全局」關鍵字,那麼在使用像局部變量一樣的活動之前,我必須首先在「調用(..)」中插入一個「全局活動」行。 這樣做會產生一個錯誤,說全局名稱'active'沒有被定義。 但是,我不確定我是否理解我的方法有什麼問題。 – gibberish 2010-08-13 11:17:12

回答

17

使用type(self)訪問類的屬性

>>> class A(object): 
var = 2 
def write(self): 
    print type(self).var 
>>> class B(A): 
pass 
>>> B().write() 
2 
>>> B.var = 3 
>>> B().write() 
3 
>>> A().write() 
2 
+2

是與使用'self .__ class__'不同的'type(self)'? – jorelli 2011-05-02 22:19:54

+3

這不是現在。但有些功能稍後可以實施。你也可以做一些猴子補丁來輸入函數。 – Odomontois 2011-05-03 19:47:20

2

您可以通過類訪問active它屬於:

if panelToggle.active: 
    # do something 

如果你想從一個方法訪問變量,你可以寫:

def am_i_active(self): 
    """ This method will access the right *class* variable by 
     looking at its own class type first. 
    """ 
    if self.__class__.active: 
     print 'Yes, sir!' 
    else: 
     print 'Nope.' 

工作示例可以在這裏找到:http://gist.github.com/522619


self變量(按照約定命名爲self)是該類的當前實例,隱式傳遞但明確接收。

class A(object): 

    answer = 42 

    def add(self, a, b): 
     """ ``self`` is received explicitely. """ 
     return A.answer + a + b 

a = A() 

print a.add(1, 2) # ``The instance -- ``a`` -- is passed implicitely.`` 
# => 45 

print a.answer 
# => print 42 
+0

是的,但我希望能夠對OBJECT_OT_openConstraintPanel執行相同的操作。我希望它有自己的靜態「活動」變量,從panelToggle繼承。我也想讓「invoke」方法在子類中工作(訪問它自己的「活動」變量而不是它的父類) – gibberish 2010-08-13 09:29:42

+0

編輯我的文章並在http://gist.github.com/522619添加示例代碼,希望它幫助。 – miku 2010-08-13 09:44:11

+0

啊,你鏈接的代碼正是我所需要的,謝謝! – gibberish 2010-08-13 09:48:01