2015-11-19 55 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__方法。