类对象、类属性与实例对象、实例属性的区别
在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所属类,于是就定义了静态方法。
原文地址:https://www.cnblogs.com/testlearn/p/12401537.html
时间: 2024-11-19 05:31:09