【问题标题】:Python: Having "not-yet-defined" class-names as default-argumentsPython:将“尚未定义”的类名作为默认参数
【发布时间】:2011-06-06 14:40:27
【问题描述】:

我有一个“class1”,它必须能够创建一个对象 不同的类名。类名作为称为“朋友”的参数传递。 我希望“朋友”参数默认为一个名为“class2”的类名。

此外,我需要对“class2”类具有相同的行为。 所以“class2”应该有“class1”作为默认的朋友参数:

class class1():
 def __init__(self, friend = class2):
  self.friendInstance = friend()

class class2():
 def __init__(self, friend = class1):
  self.friendInstance = friend()

class1()
class2()

现在我收到以下错误消息:

    def __init__(self, friend = class2):
NameError: name 'class2' is not defined

当然,我不能在 class1 之前定义 class2,因为 这将导致类似的错误:“class1”未定义。 你知道解决办法吗?

非常感谢您的帮助!

亨利

【问题讨论】:

  • 如果可行,那将是一个无限递归。

标签: python class parameters arguments default-parameters


【解决方案1】:

您可以稍后推送:

class class1(object):
    def __init__(self, friend=None):
        if friend is None:
            friend = class2
        self.friendInstance = friend()

编辑:实际上,不要那样做。它将创建一个 class2 实例,该实例创建一个 class1 实例,该实例创建一个 class2 实例等。也许您真的想传入一个实例而不是要实例化的类:

class class1(object):
    def __init__(self, friend=None):
        if friend is None:
            self.friendInstance = class2(self)
        else:
            self.friendInstance = friend

对于 class2 也是如此。这不是那么灵活,但它非常简单。如果你真的想要灵活性,你可以这样做:

class class1(object):
    def __init__(self, friend=None, friendClass=None):
        if friend is None:
            self.friendInstance = (class2 if friendClass is None else friendClass)(self)
        else:
            self.friendInstance = friend

class class2(object):
    def __init__(self, friend=None, friendClass=class1):
        if friend is None:
            self.friendInstance = friendClass(self)
        else:
            self.friendInstance = friend

这可以通过继承或元类来简化,但你可能明白了。

【讨论】:

    【解决方案2】:

    即使你解决了NameError,你也会遇到另一个问题——即你试图创建一个递归数据结构。 class1 的每个实例都尝试创建class2 的一个实例,它同样尝试创建另一个class1 实例等等,无休止(实际上只是直到你收到RuntimeError: maximum recursion depth exceeded)。

    如果您不了解您实际想要做什么,这里有一个简单的解决方案:

    class class1(object):
        def __init__(self, friend=None):
            if friend is None:
                friend = class2(self) # create a class2 instance with myself as a friend
            self.friendInstance = friend
    
    class class2(object):
        def __init__(self, friend=None):
            if friend is None:
                friend = class1(self) # create a class1 instance with myself as a friend
            self.friendInstance = friend
    
    print class1()
    # <__main__.class1 object at 0x00B42450>
    print class2()
    # <__main__.class2 object at 0x00B65530>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      相关资源
      最近更新 更多