0

好的。我一直在努力表达这个问题。我有一个子类。如果某些事情在调用时为真,我希望它创建其基类的实例。我会用 __ new __ 做这个吗?如果是这样,我会怎么做?

这是我的意思的一个例子:

import warnings
class A:
    def __init__(self, *args):
        self.val = list(args)
    def __str__(self):
        return "A"

class B(A):
    def __init__(self, *args):
        if len(args)==3:
           A.__init__(self, *args)
           return
        else:
            warnings.warn("Making an A object!")
            return A(*args)

    def __str__(self):
        return "B"
    def extramethod1(self):
        print "This method is only in a B object"

x = B(1, 2, 3)
Warning (from warnings module)
  File '/test.py', line 14
UserWarning: Making an A object!
y = B(1, 2)
print x, y
'A B'
y.extramethod1()
'This method is only in a B object'

另外,当它这样做时,我如何让 B 发出警告?

4

3 回答 3

1

请参阅上一个问题。那是在反方向问这个问题:超类是否应该返回子类实例。不过答案是一样的:改用工厂函数。

于 2012-09-17T07:48:02.427 回答
0

__init__ 应该返回无!不是对象!

您可以尝试不同的方法:

def f(*largs,**kwargs):
    if (...):
        return A(*largs,**kwargs)
    return B(*largs,**kwargs)

x = f(1,2,3) 
y = f(1,2)  

您最终可以制作 B 的 fa staticmethod 以便将其绑定到类

于 2012-09-17T07:46:50.543 回答
0

不管你这样做的动机是什么,在 Python 中,每当你调用创建类实例时,调用的是这样的:

__call__类的元类上的方法。这通常是“ type.__call__ - 很少使用自定义元类来覆盖它。

反过来,该函数调用该类的__new__对象。__new__返回一个对象,它是创建的实例——它可以来自被调用的类、它的超类、子类或任何其他 Python 对象。(包括None当人们忘记return在方法中包含适当的语句时有时会发生这种情况__new__。元类的__call__它们调用__init__新对象上的方法。

出于您的目的,最简单的方法就是编写您的__new__方法,并在您发现更合适的时候让它返回。请注意,返回值__init__总是被忽略(因此应该是隐含的,None不会误导任何阅读代码的人)。

于 2012-09-17T15:19:39.540 回答