没有使用'__init__'有没有办法做到这一点?

时间:2010-05-29 08:35:40

标签: python

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__

中的'b'方法

感谢

错误是:

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

4 个答案:

答案 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()