2010-11-30 2 views
1

Я php coder, пытаясь попасть в мир python, и это очень сложно для меня.Статические методы PHP и Python в объектах, два разных мира ...?

Самое большое использование статических методов в php - это автоматический построитель экземпляра. Нет необходимости объявлять объект, если вам нужно это один раз, в каждом файле (или с различными конструкторами Params, в одной строке)

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

echo Foo::aStaticMethod(); 
?> 

мы можем вызвать конструктор из статического метода не так ли? и мы можем получить доступ ко всему в классе, так как это был бы простой метод ... у нас даже может быть STATIC CONSTRUCTOR в php-классе и называть его так: 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.s. цель всего этого состоит в том, чтобы писать как можно меньше кода. P.p.s Значительный комментарий кода примера оценивается

Спасибо.

+0

Ваш код является неполным и неправильно. Как вы создаете свои «статические» методы в Python? – 2010-11-30 13:54:31

+0

Это также не работает в php, по крайней мере, не в php> 5.2. Но я никогда не слышал об этом в более ранних версиях. Когда я запускаю этот скрипт, я получаю «PHP Fatal error: использование $ 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. Это обеспечивает класс как первый аргумент.

EDIT:

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 методы, как функции, определенные классы находящиеся, единственное применение, чтобы поместить их в объект, чтобы держать их с классом в качестве вспомогательных функций. class методы могут получить доступ только к переменным, определенным в классе (декоратор @classmethod). Это более или менее то, что PHP вызывает статические элементы или методы. Первым параметром таких методов может быть cls, а содержимое класса можно получить через cls. Обычные методы должны получить self в качестве первого параметра и являются единственными, кто сможет получить доступ к членам экземпляра.

Если вам нужны несколько объектов того же типа, вам обязательно нужны экземпляры, а другие типы не то, что вы ищете. Если у вас есть только один экземпляр объекта, вместо него вы можете использовать методы класса (или статические методы PHP).

Но в большинстве случаев вам не следует это делать, если вы не знаете, почему и просто придерживайтесь экземпляров объектов и обычных методов, иначе это преждевременная оптимизация, и ваш код, скорее всего, вас укусит позже из-за многих которые вы вводите.

Смежные вопросы