2015-11-19 121 views
-1

內的一類功能我有蟒蛇3.的Python 3:調用__init__

我想創建一個類,它使用從該類內的功能一個小問題。就像:

class Plus: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

     self.test() 

    def test(self): 
     return self.x + self.y 

我現在做這樣的事情

a = Plus(5,6)  
print(a) 

和Python是給我

<__main__.Plus object at 0x000000000295F748> 

,而不是11,我想它。我知道我可以通過

a = Plus(5, 6).test() 
print(a) 

但這不是我想要的。我想調用該類並獲取結果,但不添加.test()。

你能幫我嗎?

回答

0

你需要定義一個__str__ methodPlus類:

class Plus: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def test(self): 
     return self.x + self.y 

    def __str__(self): 
     return str(self.test()) 
+0

然後記住將字符串解析回double或int類型。 – Henrik

+0

@Henrik'__str__'應該返回一個字符串,不過。 –

+0

這正是我的觀點。如果你想'c = a + b',並且'a'是double,'b'是double,你會期望'c'是一個double ..不是字符串,否則'Plus(a ,b)+ Plus(a,b)'? – Henrik

0

我會去:

class Plus: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

     self.test() 

    def test(self): 
     res = self.x + self.y 
     self.__repr__ = lambda:str(res) 
     return res 

>>> Plus(5,5) 
10 
>>> a = Plus(5,5) 
>>> a 
10 
>>> a.test() 
10 

這樣,你是不是重新計算每次調用打印時間的總和,它在你調用測試方法時更新。

+0

這不會按原樣工作; '__repr__'必須是可調用的,而'str'實例不是。 –

+0

lamba的工作然後,謝謝 – Netwave

+0

這是一個反模式:它將*只*工作在Python 2中,然後只當'Plus'是一箇舊的風格類。在新樣式類中,像'__repr__'這樣的特殊方法不會在實例上查找,只能在類中查找。一個更好的模式是捕獲'res'作爲屬性並實現'__repr__' *方法*作爲'return self.res'。 – lvc

-1

編輯: 忽略這個答案,那就是對這個問題

這是錯誤的曲解評論。當你實例化一個對象時,你會期望獲得對該對象的引用。

如果你只是想要一個全局函數返回一個數字,爲​​什麼還打算用init來創建一個類?

在Python中,你不應該想要在C#中使用靜態類來進行封裝。改爲命名模塊,並將其用於封裝。

+0

無論如何,你都得到了參考,它只是對象的表示,他想打印的數字是 – Netwave

+0

,這不是我對這個問題的解釋。我現在重新閱讀它,並且仍然認爲這個問題涉及到獲得編號11 – Henrik

+0

他希望調用print(a)將返回總和的結果而不是python通常打印的對象內存東西 – Netwave

0

now I am doing something like

a = Plus(5,6)  
print(a) 

and python is giving me

<__main__.Plus object at 0x000000000295F748> 

and not 11 as I want it. I know that I can get 11 by

a = Plus(5, 6).test() 
print(a) 

but that's not what I want. I want to call the class and getting the result without adding .test() to it.

我不知道你是什麼意思「,而不是11,因爲我想它。如果你想Plus(5, 6)實際返回11int實例),你應該使Plus函數返回總和。或者,你可以重寫__new__方法並鉤上對象創建 - 但這是一個壞主意。

你想達到什麼目的?

我懷疑,那''而不是11',因爲我想要'你想要一些特別的東西(格式化,代表)。如果是,則覆蓋__str____unicode____repr__方法。