Python 3: 在__init__中调用类函数
我有一个关于Python 3的小问题。
我想创建一个类,这个类里面有一个函数可以被调用。就像这样:
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。我知道我可以通过下面的方式得到11:
a = Plus(5, 6).test()
print(a)
但这不是我想要的。我希望调用这个类的时候,直接得到结果,而不需要加上.test()。
你能帮我吗?
相关问题:
- 暂无相关问题
4 个回答
-1
编辑:
忽略这个回答,它是对问题误解的评论。
这完全是错误的。
当你创建一个对象时,你应该能得到那个对象的引用。
如果你只是想要一个全局函数返回一个数字,那为什么还要费劲去创建一个带初始化方法的类呢?
在Python中,你不应该像在C#中那样想要静态类来实现封装。相反,给模块起个名字,然后用它来实现封装。
0
现在我正在做类似这样的事情:
a = Plus(5,6)
print(a)
然后Python给我的结果是:
<__main__.Plus object at 0x000000000295F748>
而不是我想要的11。我知道我可以通过以下方式得到11:
a = Plus(5, 6).test()
print(a)
但这不是我想要的。我想直接调用这个类,得到结果,而不需要在后面加上.test()。
我不太明白你说的“而不是我想要的11”是什么意思。如果你希望Plus(5, 6)实际返回11(一个整数),你应该把Plus做成一个返回和的函数。或者你可以重写__new__方法,在对象创建时进行处理——但这样做并不好。
你想要实现什么呢?
我怀疑你说的“而不是我想要的11”是不是想要某种特别的输出(格式化的,表示的)。如果是这样的话,可以重写__str__、__unicode__或__repr__方法。
1
我建议这样做:
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
你需要为你的 Plus 类定义一个 __str__ 方法:
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())