在python中从__new __()调用其他类方法

时间:2018-10-27 14:50:05

标签: python python-3.x class oop

我创建了一个foo类,如下所示:

class foo():

    def __new__(cls, a, b, c, add=True):
        return cls.sum(a, b, c) if add else cls.subtract(a, b, c)

    def sum(a, b, c):
        return a + b + c

    def subtract(a, b, c):
        return c - b - a

print(foo(1, 2, 3, True))

该程序以6的形式返回所需的结果。但是,我需要弄清楚一些概念:

  1. 使用这种方法或OOP设计是正确的还是有更好的方法呢?我希望类返回一个值或任何其他对象(不是它自己的类实例)
  2. 不管上面的结构如何,如果sumsubtract是实例方法,如何在不实例化对象的情况下调用它们,如上面的示例print(...)一样?

我观察到许多python API和框架通过类实例化返回对象或值。

我正在尝试了解python中OOP的核心概念,请帮忙。

1 个答案:

答案 0 :(得分:2)

Say the width of the Image is 720. Then: my_background_image.setX( (int)(screen_width/720) /2 ); sum确实是实例方法。

subtract

但这只是因为当您通过实例访问它们时,Python动态创建了一个方法(基本上只是将第一个参数绑定到对象,通常是>>> foo_obj = object.__new__(foo) # This will actually create a foo object to demonstrate >>> foo_obj.sum <bound method foo.sum of <__main__.foo object at 0x0000000000000000>> >>> type(foo_obj.sum) <class 'method'>

但是,您可以通过该类访问包装的函数:

self

因此,在您的>>> foo_obj.sum.__func__ <function foo.sum at 0x0000000000000001> >>> foo.sum <function foo.sum at 0x0000000000000001> >>> foo_obj.sum.__func__ is foo.sum True 函数中,它将不会绑定第一个参数,并且它们将调用基础函数,而不是使它们成为实例方法。

要解决警告,可以将其设置为classmethodstaticmethod。但是,通常不建议从__new__返回不作为类实例的对象。如果您真的想使用OOP,请使用__new__子类或进行包装,这样您就可以:

int

>>> class Foo:
    __slots__ = 'value',
    def __init__(self, a, b, c, add=True):
        self.value = self.sum(a, b, c) if add else self.subtract(a, b, c)
    @staticmethod
    def sum(a, b, c):
        return a + b + c
    @staticmethod
    def subtract(a, b, c):
        return c - b - a
>>> foo = Foo(1, 2, 3, True)
>>> foo
<__main__.foo object at 0x0000000000000002>
>>> foo.value
6