2010-11-30 74 views
1

我是php編碼器,試圖進入Python世界,對我來說非常困難。對象中的PHP和Python靜態方法,兩個不同的世界......?

在php中最大的享受靜態方法是實例的自動構建器。無需申報的對象,如果你需要它一次,在每一個文件(或具有不同的構造函數參數,可以在一行中)

<?php 
class Foo { 
    function __constructor__(){ 
     $this->var = 'blah'; 
    } 
    public static function aStaticMethod() { 
     return $this->var; 
    } 
} 

echo Foo::aStaticMethod(); 
?> 

我們可以從靜態方法調用構造函數不是嗎?我們可以在類中訪問所有的東西,因爲它會是一個簡單的方法...我們甚至可以在php類中使用STATIC CONSTRUCTOR,並像下面這樣調用它:Object :: construct() - > myMethod(); (每次通過不同的參數)

但不是在python中? @staticmethod在類中的方法一個簡單的函數,看不到任何東西??

class socket(object): 

def __init__(self): 
    self.oclass = otherclass() 
    print 'test' # does this constructor called at all when calling static method??     

@staticmethod 
def ping(): 
    return self.oclass.send('PING') # i can't access anything!!! 


print Anidb.ping() 

我不能從神該死的靜態方法來訪問任何東西,它就像一個獨立的功能或類似這樣的東西..?

也許我在用錯誤的裝飾器?也許有像php提供的靜態方法在Python中的東西?

1)請說出爲什麼靜態方法是孤立的 2)請告訴我如何使像php靜態方法一樣的行爲。 3)請告訴我這個替代實際用法,如果php靜態方法的行爲是壞事

P.所有這一切的目標是儘可能少寫代碼。 P.p.s讚賞示例代碼的重要評論

謝謝。

+0

你的代碼是不完整的,縮進不正確。你如何在Python中創建你的「靜態」方法? – 2010-11-30 13:54:31

+0

這也是不工作在PHP中,至少不是在PHP> 5.2。但我在早期版本中從未聽說過它。當我運行該腳本時,我得到了「PHP致命錯誤:使用$ this,而不是在對象上下文中」,這是非常有意義的... – enricog 2010-11-30 14:07:28

+0

你的意思是你不能訪問靜態方法在PHP中的非靜態方法? – holms 2010-11-30 14:11:52

回答

2

我看到你已經接受了另一個答案,但我不確定它會與你的代碼一起工作。具體而言,oclass變量僅爲類的實例創建,而不是爲類本身創建。你可以做這樣的:

class socket(object): 
    oclass = otherclass()     

    @classmethod 
    def ping(cls): 
     return cls.oclass.send('PING') 

socket.ping() 

但是,使用現有的代碼,並刪除所有裝飾,你可以簡單地實例並在同一線路上使用方法:

socket().ping() 
3

你想代替classmethod。這提供了類作爲第一個參數。

編輯:

class C(object): 
    foo = 42 

    @classmethod 
    def printfoo(cls): 
    print cls.foo 

C.printfoo() 
3

在PHP中的靜態方法並不像你認爲,他們不能訪問實例成員。沒有$this!跟他們。

<?php 
class Foo { 

    public static $var = 'foo '; 

    function __construct(){ 
     echo 'constructing '; 
     $this->var = 'blah '; 
    } 

    public function aMethod() { 
     return $this->var; 
    } 
    public static function aStaticMethod() { 
     #return $this->$var; -> you can't do that, 
     # $this can be accessed only in instance methods, not static 
     return self::$var; 
    } 
} 

$foo = new Foo(); 
echo $foo->aMethod(); 

echo Foo::aStaticMethod(); 

?> 

的Python中有三種在對象的方法static方法是像ouside類中定義的功能,唯一的用途把他們目的是讓他們與類的輔助功能。 class方法只能訪問類中定義的變量(裝飾器@classmethod)。這或多或少是PHP調用靜態成員或方法的。這些方法的第一個參數應該是cls,類的內容可以通過cls訪問。普通方法必須獲得self作爲第一個參數,並且是唯一能夠訪問實例成員的方法。

如果你想要幾個相同類型的對象,你肯定需要實例,其他類型不是你要找的。如果只有一個對象實例,則可以使用類方法(或PHP靜態方法)。

但是在大多數情況下,如果您不知道爲什麼,只是堅持使用對象和常規方法的實例,那麼您應該不會這麼做,否則就會提早進行優化,並且您的代碼很可能會因爲多次限制你介紹。