Skip to main content
 首页 » 编程设计

对象中的 PHP 和 Python 静态方法,两个不同的世界......

2025年05月04日18wayfarer

我是 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.s 感谢对示例代码的大量评论

谢谢。

请您参考如下方法:

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 方法只能访问类中定义的变量(decorator @classmethod)。这或多或少就是 PHP 所说的静态成员或方法。这类方法的第一个参数应该是cls,类的内容可以通过cls访问。普通方法必须将 self 作为第一个参数,并且是唯一能够访问实例成员的方法。

如果你想要多个相同类型的对象,你肯定需要实例,而其他类型不是你要找的。如果您只有一个对象实例,则可以改用类方法(或 PHP 静态方法)。

但在大多数情况下,如果您不知道为什么而只坚持使用对象实例和普通方法,那么您不应该费心这样做,否则就是不成熟的优化,并且由于许多限制,您的代码可能会在以后咬住您你介绍一下。