我有一个“class1”,它必须能够创建一个对象 不同的班级名称。类名作为名为“friend”的参数传递。 我希望“friend”-argument默认为名为“class2”的类名。
此外,我需要对类“class2”具有相同的行为。 因此“class2”应该将“class1”作为默认的friend-argument:
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”未定义。 你知道解决方案吗?
非常感谢你的帮助!
亨利
答案 0 :(得分:3)
你可以把它推到以后:
class class1(object):
def __init__(self, friend=None):
if friend is None:
friend = class2
self.friendInstance = friend()
编辑:实际上,不要这样做。它将创建一个class2实例,创建一个创建class2实例的class1实例,等等。也许你真的想要传入一个实例来代替要实例化的类:
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
这可以通过继承或元类简化,但你可能会理解。
答案 1 :(得分:1)
即使你解决了NameError
,你也会遇到另一个 - 即你试图创建一个递归数据结构。 class1
的每个实例都尝试<em>创建 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>