2015-01-01 51 views
4

我正在寫一些代碼,在Python 3工作,但不是Python的2防止成爲了一個Python instancemethod 2

foo = lambda x: x + "stuff" 

class MyClass(ParentClass): 
    bar = foo 

    def mymethod(self): 
     return self.bar(self._private_stuff) 

我希望它簡單地打印私密的東西,但如果我的函數嘗試的MyMethod運行,我得到:

TypeError: unbound method <lambda>() must be called with MyClass instance as first argument (got str instance instead) 

當然,以上是不實際的代碼,但真實的東西簡單化。我想這樣做,因爲我需要傳遞我不想公開最終用戶的私人信息,即任何擴展我的課程的人。但在Python 2中,全局級lambda(或任何普通函數)變成instancemethod,在這種情況下這是不需要的!

你推薦我做這段代碼是否便攜?

+3

必須說:如果有人可以擴展你的課程,你不能保持信息的私密性。 –

+0

我不希望其他人需要知道如何做self._private的東西。他們可以,如果他們想。但這就是我寫這個的原因,所以他們不需要。 – jleeothon

+0

我不明白它如何在Py3中工作。這裏的情況幾乎是一樣的,除了我得到一個不同的消息:'TypeError:()需要1個位置參數,但2給出了' - 而Py2給我幾乎相同的消息'TypeError:()只需要1個參數(2給出)'。 – glglgl

回答

4

我會和Alex Martelli的建議一起去的。儘管如此,(在我看到Alex Martelli的美麗答案之前,我寫了這個答案),您還可以在Python 2.7和3.x中執行以下操作(特別注意我提供的文檔鏈接,以便了解發生了什麼事情):

您可以使用static method,它不會指望隱含的第一個參數。請注意,lambda expressions cannot take statements,因此您將無法在2.x中的lambda函數中使用print語句。

foo = lambda x: x   # note that you cannot use print here in 2.x 

class MyClass(object): 

    @staticmethod   # use a static method 
    def bar(x): 
     return foo(x)  # or simply print(foo(x)) 

    def mymethod(self): 
     return self.bar(1) 

>>> m = MyClass() 
>>> m.mymethod() 
1 
+0

對!我的壞,但這是無論如何有用。更新我的問題以反映這一點。 – jleeothon

8

最簡單的:

class MyClass(ParentClass): 
    bar = staticmethod(foo) 

與您的代碼保持相同的其餘部分。雖然staticmethod最常用作「裝飾者」,但並不要求這樣做(因此,不需要進一步的間接級別來使bar成爲調用foo的裝飾方法)。