小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2024-06-04 / 17 阅读
0
0

Python PHP 面向对象 self关键字区别|Python与PHP中的类方法引用:深入理解`cls`与`self`及PHP的`static::`

在PHP和Python中,self关键字虽然在表面看起来有相似之处,但它们在各自语言中的用途和含义是有区别的。

PHP中的self关键字

在PHP中,self是一个伪变量,用于访问当前类的静态成员(属性和方法)。当在一个类的上下文中使用 self时,它总是引用该类自身,而不是类的实例。这意味着通过 self访问的成员必须是声明为 static的。

特点:

  • 用于访问静态属性和调用静态方法。
  • 指向定义它的类,而不是类的实例。
  • 在继承结构中,self::总是引用当前类定义的静态成员,而不是父类或子类中的同名成员。

示例:


class MyClass {

public static $myVar = 'Hello';





public static function showVar() {



echo self::$myVar; // 访问静态属性



}



}



MyClass::showVar(); // 输出: Hello

Python中的self关键字

Python中的 self不是关键字,而是一个约定俗成的命名习惯,用于在类的方法中引用实例本身。每个类方法的第一个参数(通常命名为 self)自动传递给方法,表示该方法作用于哪个实例。

特点:

  • 用于在类的方法内部访问实例的属性和方法。
  • 不是静态概念,每个实例方法调用时都会有一个独立的 self
  • 强制要求在实例方法定义中包含,即使不使用也要保留。

示例:


class MyClass:

def init(self, my_var):



self.my_var = my_var





def show_var(self):



print(self.my_var) # 访问实例属性





obj = MyClass('Hello')

obj.show_var()  # 输出: Hello

总结

  • PHP的self 主要用于静态上下文,指向类本身,访问静态属性和方法。
  • Python的self 是实例方法中对当前实例的引用,用于访问实例的属性和方法,是实例方法签名的一部分,反映了面向对象的实例化特性。

两者虽名称相似,但实质上反映了各自语言在处理类、实例以及静态成员方面的不同设计理念。

cls与self区别

在Python中,clsself都是关键字,用于方法定义中,但它们代表的意义和用途不同。

  1. self:
    • self用于实例方法(普通方法)中,是实例方法的第一个参数,代表该方法的调用者,即类的实例本身。
    • 当你创建一个类的实例并调用其方法时,Python会自动将实例本身作为第一个参数传递给该方法,这个参数就是 self
    • 使用 self可以访问实例的属性和其它方法。

示例:

class MyClass:
    def __init__(self, value):
        self.value = value
  
    def print_value(self):
        print(self.value)

obj = MyClass(10)
obj.print_value()  # 输出:10
  1. cls:
    • cls用于类方法(静态方法)中,是类方法的第一个参数,代表当前类本身。
    • 类方法可以通过类或其实例来调用,但不论如何调用,cls参数总是指向定义该方法的类,而不是类的某个实例。
    • 使用 cls可以访问类变量、调用类方法或者创建类的新实例。

示例:

class MyClass:
    class_var = "I am a class variable."
  
    @classmethod
    def print_class_variable(cls):
        print(cls.class_var)

MyClass.print_class_variable()  # 输出:I am a class variable.
obj = MyClass()
obj.print_class_variable()  # 同样输出:I am a class variable.

总结:

  • self用于实例方法,代表方法调用的实例对象。
  • cls用于类方法,代表当前类。

Python中cls也可访问普通属性对吗

在Python中,cls 通常用于类方法(由 @classmethod 装饰器标记的方法)中,它代表的是类本身,而非类的实例。因此,使用 cls 时,可以直接访问类变量(静态变量),但不能直接访问实例变量(需要通过类的实例来访问)。

访问类变量

类变量是在类定义中,在任何方法之外定义的变量,所有该类的实例以及类本身都可以访问这些变量。

class MyClass:
    class_var = "I am a class variable."

    @classmethod
    def print_class_variable(cls):
        print(cls.class_var)  # 正确访问类变量

MyClass.print_class_variable()  # 输出: I am a class variable.

访问实例变量

实例变量是定义在实例方法(如 __init__)中,使用 self 作为前缀的变量,每个实例都有自己的一套实例变量。

如果你想从类方法中访问实例变量,通常需要先创建类的实例,然后通过该实例来访问:

class MyClass:
    def __init__(self):
        self.instance_var = "I am an instance variable."

    @classmethod
    def access_instance_variable(cls):
        # 通常不直接从类方法访问实例变量,但可以通过创建实例来间接访问
        instance = cls()
        print(instance.instance_var)

MyClass.access_instance_variable()  # 输出: I am an instance variable.

注意,上面的例子中,access_instance_variable 类方法通过创建类的新实例来访问实例变量,这在某些情况下可能是不合适的,因为可能并不总是希望或需要创建实例。通常,类方法处理与类状态相关的操作,而不直接与特定实例的属性交互。如果发现需要在类方法中频繁访问实例变量,可能需要重新考虑设计,看看是否应该使用实例方法或调整数据组织方式。

self和cls的生命周期

在Python中,selfcls的"生命周期"概念可以从它们所关联的对象的生存周期来理解:

  1. self的生命周期:

    • self与类的实例紧密相关。每当创建类的一个新实例时,就会为这个实例分配内存,并且 self就指向这个新的内存区域。因此,self的生命周期等同于该实例的生命周期。
    • 实例的生命周期从使用 class_name()语法创建它开始,到不再有引用指向它,从而被垃圾回收机制销毁结束。
  2. cls的生命周期:

    • cls代表的是类本身,而不是类的某个具体实例。类在被定义后,只要程序还在运行,这个类就会存在(除非你通过特殊手段如 del语句删除了它),因此可以说 cls的生命周期几乎等同于程序的执行周期。
    • 类只有一份定义,不论你创建多少个该类的实例,cls始终指向这个类的定义,不会随实例的创建或销毁而变化。

总结来说,self的生命周期依赖于类实例的创建和销毁,每个实例有自己的 self;而 cls代表类,其生命周期通常更长,与程序运行周期接近,不依赖于实例的存在与否。

PHP中的self相当于cls吗?

在PHP中,self与Python中的 cls并不完全相对应,但它们在各自语言中扮演着类似的角色。

  • PHP中的 self:

    • self是一个语言关键字,用于在类的上下文中引用该类自身。它主要用于访问静态成员变量和调用静态成员方法。当你在一个类的方法内部使用 self时,你实际上是在指代当前类,而无需通过实例或类名来限定。
    • 例如,self::someStaticMethod()用于调用类的静态方法,self::$someStaticProperty用于访问类的静态属性。
    • self并不直接对应于某个特定的实例,而是与类级别(静态)的上下文有关。
  • 对比Python中的 cls:

    • 如前所述,Python中的 cls用于类方法,也是用来引用定义该方法的类本身,允许在类方法内部访问类变量或创建类的新实例,这与PHP中 self的作用相似。
    • 但是,需要注意的是,Python中的 selfcls分别对应实例方法和类方法中的“类的实例”和“类本身”,而PHP中并没有直接对应 cls概念的关键词,尽管 self在功能上部分重叠,但PHP更多地是通过 static关键字和后期静态绑定(static::)来处理类级别的引用。

总之,虽然两者都用于在类内部引用类本身,但它们的应用场景、语法以及所处的语言环境有所不同。PHP中的 self主要对应于静态上下文,而Python中的 cls专门用于类方法,以区别于实例方法中的 self

有关PHP static::访问PHP面向对象 static::


评论