python中类对象实例对象类属性实例属性类方法实例方法静态方法

Posted 不自在

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中类对象实例对象类属性实例属性类方法实例方法静态方法相关的知识,希望对你有一定的参考价值。

类对象、类属性与实例对象、实例属性的区别

在Python中一切皆是对象,类是一个特殊的对象即类对象,描述类的属性称为类属性。类属性在内存中只有一份,在__init__外部定义。

通过类创建的对象称为实例对象,描述实例对象的属性称为实例属性。实例属性在各自对象的内存中都保存一份,在__init__方法内部定义。

实例方法、类方法、静态方法的区别

这三种方法都是保存在类的内存中,调用者不同。

  • 实例方法由对象调用,至少一个self参数,self代表对象的引用。
  • 类方法有类调用,至少一个cls参数,并且需要装饰器@classmethod修饰。
  • 静态方法由类调用,不需要参数,需要装饰器@staticmethod修饰。

创建原则:

  • 只要访问了成员变量的方法都叫实例方法
  • 只访问类变量的方法叫类方法
  • 既不访问成员变量,也不访问类变量的方法叫成静态方法

举例说明

class Car(object):      # 类对象
    car_num = 0   # 类属性,在__init__外部定义。

    def __init__(self, brand, price):
        self.brand = brand  # 实例属性,在__init__内部定义
        self.price = price
        Car.car_num += 1

    def level(self):        # 实例方法,调用了实例属性
        if self.price > 300000:
            print(f"{self.brand}是高级轿车")
        else:
            print(f"{self.brand}是非高级轿车")

    @classmethod
    def car_count(cls):     # 类方法,只访问类变量
        print(f"我有{cls.car_num}辆车")

    @staticmethod
    def tips():     # 静态方法,既不访问成员变量,也不访问类变量
        print("温馨提示:开车不喝酒")


if __name__ == "__main__":
    bmw = Car("宝马", 200000)     # 通过类创建的对象称为实例对象
    bmw.level()
    wlhg = Car("五菱宏光", 400000)
    wlhg.level()
    Car.car_count()     # 调用类方法
    Car.tips()      # 调用静态方法

 

为什么会有静态方法?

静态方法既不访问成员变量,也不访问类变量,若写个和class同级别的def函数也能实现同样的功能,何必定义个静态方法呢?定义静态方法主要是规避两个模块调用同名函数的情况,

假设一个场景:为Car类定义一个同级别的def tips函数,再为Animal类定义一个同级别的def tips函数

class Car(object):
    pass


def tips():
    print("温馨提示:开车不喝酒")


class Animal(object):
    pass


def tips():
    print("温馨提示:不要伸手投食")

在python中,前面定义的函数会被后定义的同名函数覆盖,也就是说,按上面的场景调用tips 方法最终都调用的都是最后一个。为了明确各个tips所属类,于是就定义了静态方法。

以上是关于python中类对象实例对象类属性实例属性类方法实例方法静态方法的主要内容,如果未能解决你的问题,请参考以下文章

Python中类的属性方法及内置方法

Python3 之 类属性与实例属性

JAVA中类实例与Class对象

python基础1-类属性和实例属性

es6中类中的静态属性实例属性静态方法实例方法的个人理解

PHP中类的$this关键字 self关键字