2014-03-04 34 views
1

我越過了一個有趣的問題。如何訪問課堂範圍內的「自我」?

假設我們有一個類,並且在它的構造函數中我們將一個布爾值作爲參數。我如何根據實例的條件/布爾值定義類中的方法?例如:

class X(): 
    def __init__(self, x): 
     self.x = x 
    if self.x == true: # self is unreachable outside a method. 
     def trueMethod(): 
      print "The true method was defined." 
    if self.x == false: # self is unreachable outside a method. 
     def falseMethod(): 
      print "The false method was defined." 
+1

你爲什麼要這樣做?似乎它只會混淆用戶。 –

+0

'self'就像其他語言的'this'。它只能用實例方法訪問。 – Nilesh

+1

在構造函數中定義你的方法。如果你想讓他們成爲方法,給他們一個自我參數。 –

回答

3

你不能,但你可以定義具有不同名稱的方法,並在某些情況下暴露它們。例如:

class X(object): 
    def __init__(self, flag): 
     if flag: 
      self.method = self._method 

    def _method(self): 
     print "I'm a method!" 

測試它:

>>> X(True).method() 
I'm a method! 
>>> X(False).method() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'X' object has no attribute 'method' 
3

沒有,因爲self是指一個實例,並在類中定義的時候有沒有實例呢。

有許多方法可以實現類似的效果(如在__init__中按照每個實例重命名,添加或刪除方法),但是無論如何沒有真正的理由這樣做。

+0

在我開發的引擎中,我有一個Grect類(網格矩形),它可以用作背景或不用(構造函數採用boolean:isBackground)。如果布爾值爲true,那麼我定義了「addBackground」方法,以便實例可以達到它。我不想讓一個實例不能訪問「addBackground」方法。 –

+2

@EricsonWillians:有更好的解決方案。一個是爲背景矩形創建一個子類,並將該方法放在那裏。另一種方法是給Grect類添加'addBackground'方法,但要檢查'self.isBackground'是否爲true,如果不是,則會引發錯誤。 – BrenBarn

+0

你是對的!非常感謝你! –

2

你不能這樣做,但定義在飛行的方法,你可以使用types.MethodType

from types import MethodType 

def trueMethod(self): 
    print "The true method was defined." 
def falseMethod(self): 
    print "The false method was defined." 

class X(): 
    def __init__(self, x): 
     self.x = x 
     if self.x: 
      self.trueMethod = MethodType(trueMethod, self, X) 
     elif not self.x: 
      self.falseMethod = MethodType(falseMethod, self, X) 
1

您可以創建字典和在價值的基礎上,您可以訪問像

def __init__(self, x): 
    self.x = x 
    self.my_dict = {True : lambda *a : print "True method", False: lambda *a: print "False method"} 

然後你可以訪問self.my_dict[self.x]