class a(object):
c=b()# how to call the b method
d=4
def __init__(self):
print self.c
def b(self):
return self.d+1
a()
如何调用不在__init__
感谢
错误是:
Traceback (most recent call last):
File "D:\zjm_code\a.py", line 12, in <module>
class a(object):
File "D:\zjm_code\a.py", line 13, in a
c=b()# how to call the b method
NameError: name 'b' is not defined
答案 0 :(得分:4)
我会改用property:
class a(object):
d=4
def __init__(self):
print self.c
def b(self):
return self.d+1
c = property(b)
a()
a.c # returns a.b()
答案 1 :(得分:1)
如果您希望a().c
始终返回a().d + 1
,请使用属性as suggested by Olivier。但是,如果您希望a
及其派生类具有一个类属性,该属性的值动态设置为类中c
的声明(或继承)值的+1,那么您可以使用元类。
def meta(name, bases, class_locals):
class_locals['c'] = class_locals.get('d', 0) + 1
return type.__new__(name, bases, class_locals)
class A(object):
__metaclass__ = meta
d = 4
def __init__(self):
print self.c
class B(A):
d = 5
>>> A()
5
>>> B()
6
>>> print A.c
5
>>> print B.c
6
答案 2 :(得分:0)
您已将b定义为实例方法(“常规”方法)。这样的方法只能在类的实例上调用。
在您的代码中,您尝试在类定义中调用“b”方法。在类定义中,您只能调用该类的静态方法和类方法,而不能调用实例方法。我建议阅读有关classmethod和staticmethod装饰器的内容。
一个例子,为了推动你正确的方向:
class A(object):
d = 42
c = b()
@classmethod
def b(klass): # "class" is a Python keyword so we can't use it here
return klass.d + 1
答案 3 :(得分:0)
你不能直接这样做。首先,正如Francesco所说,你不能在没有实例的情况下调用方法b来调用它。您可以将方法更改为类方法,但需要该类的实例,直到您到达类定义的末尾才会存在该实例。
我认为你能得到的最接近的是使b成为一个类方法并在确定类之后初始化c:
class a(object):
d = 4
def __init__(self):
print self.c
@classmethod
def b(cls):
return cls.d+1
a.c = a.b()