Python 3:在__init__中调用类函数

时间:2015-11-19 11:14:38

标签: python function class 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 个答案:

答案 0 :(得分:0)

您需要为Plus课程定义__str__ method

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())

答案 1 :(得分: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

这样,您每次调用print时都不会重新计算总和,当您调用测试方法时,它会更新。

答案 2 :(得分: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)实际返回11int实例),则应使Plus成为返回总和的函数。或者,您可以覆盖__new__方法并挂钩对象创建 - 但这是一个坏主意。

你想要达到什么目标?

我怀疑,通过'而不是11,因为我想要它'你想要一些特别的东西打印(格式化,代表)。如果是,请覆盖__str____unicode____repr__方法。

答案 3 :(得分:-1)

编辑: 忽略这个答案,它是对问题误解的评论

这是错的。 当您实例化一个对象时,您希望获得对该对象的引用。

如果你只想要一个返回数字的全局函数,为什么还要打扰用init创建一个类呢?

在python中你不应该像C#中的静态类一样进行封装。而是将模块命名为某种东西,并将其用于封装。