2010-05-29 93 views
0
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() 

如何調用 'B' 法不__init__有沒有辦法做到這一點,而不使用'__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 
+2

你想做什麼? – kennytm 2010-05-29 08:37:12

+1

注意,因爲b是一個方法(self是它的第一個參數),所以你不能把它稱爲b()而沒有任何參數,你需要一個a的實例來工作。 – Francesco 2010-05-29 08:41:11

回答

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

很好的解讀OP的想法。 =] – strager 2010-05-29 10:26:08

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 
0

你不能直接這樣做。首先,正如弗朗西斯科所說的,如果沒有實例來調用它,你就不能調用方法b。您可以將該方法更改爲classmethod,但需要該類的一個實例,直到到達類定義的末尾纔會存在該實例。

我認爲你可以得到最接近的是讓巴類方法和初始化C中的類已definined後:

class a(object): 
    d = 4 
    def __init__(self): 
     print self.c 

    @classmethod 
    def b(cls): 
     return cls.d+1 

a.c = a.b() 
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 
相關問題