类方法与静态方法与普通方法、实例属性与类属性
前言
python中类方法(Class Method)、静态方法(Static Method)和普通方法(Instance Method)是在类中定义的三种不同类型的方法。
class Car:
# 类属性
manufacturer = "ABC Motors"
def __init__(self, model, year):
# 实例属性
self.model = model
self.year = year
# 类方法
@classmethod
def get_manufacturer(cls):
return cls.manufacturer
# 静态方法
@staticmethod
def calculate_mileage(distance, fuel_consumption):
return distance / fuel_consumption
# 普通方法
def get_age(self, current_year):
return current_year - self.year
# 创建 Car 类的实例
car1 = Car("SUV", 2020)
# 调用类方法
manufacturer = Car.get_manufacturer()
print(manufacturer) # 输出: ABC Motors
# 调用静态方法
mileage = Car.calculate_mileage(500, 20)
print(mileage) # 输出: 25.0
# 调用普通方法
age = car1.get_age(2023)
print(age) # 输出: 3
- get_manufacturer() 是一个类方法,用于获取汽车制造商的名称。它可以通过类名或实例调用。
- calculate_mileage() 是一个静态方法,用于计算汽车的行驶里程。它可以通过类名或实例调用。
- get_age() 是一个普通方法,用于计算汽车的年龄。它只能通过实例调用,并且自动将实例作为第一个参数传递给方法。
注意:在类方法和静态方法中,无法直接访问实例属性(例如self.model),只能访问类属性(只能通过类名访问类属性cls.manufacturer)。而普通方法可以访问和修改实例属性和类属性。
一、类方法(Class Method)
class Car:
# 类属性
manufacturer = "ABC Motors"
def __init__(self, model, year):
# 实例属性
self.model = model
self.year = year
# 类方法
@classmethod
def get_manufacturer(cls):
cls.manufacturer="在类方法中通过类名cls修改类属性"
# print(model)#没有办法访问实例属性
return cls.manufacturer
# 通过类名调用类方法
manufacturer = Car.get_manufacturer()
print(manufacturer) # 输出: 在类方法中通过类名修改类属性
# 通过实例名调用类方法
car=Car("model","2023")
print(car.get_manufacturer())# 输出: 在类方法中通过类名修改类属性
- 类方法是属于类的方法,而不是属于实例(对象)的方法。
- 它在定义时使用 @classmethod 装饰器进行标识。
- 类方法的第一个参数通常是 cls,它表示对类自身的引用,类似于实例方法中的 self。
- 类方法可以通过类名直接调用,也可以通过实例调用。当通过实例调用时,类方法会自动将类作为第一个参数传递给方法。
- 类方法可以通过类名(cls/CLS)访问和修改类属性(cls/CLS…),但不能访问实例属性(self…)。
- 类方法通常用于在不需要访问实例状态的情况下对类进行操作,或者在创建实例之前对类进行一些初始化操作
二、静态方法(Static Method)
# 静态方法没有 self 或 cls 参数,
#因此无法访问实例属性或类属性,但是可以通过类名间接访问类属性。
class MyClass:
class_attr = "Class Attribute"
def __init__(self, instance_attr):
self.instance_attr = instance_attr
@staticmethod
def static_method():
print("This is a static method")
# 无法直接访问实例属性
# print(self.instance_attr) # 错误
# 可以访问类属性
MyClass.class_attr="kong"
print(MyClass.class_attr)
# 创建实例并调用静态方法
obj = MyClass("Instance Attribute")
obj.static_method()
# This is a static method
# kong
MyClass.static_method()
# This is a static method
# kong
# 静态方法static_method()无法直接访问self.instance_attr(实例属性),
# 但可以通过MyClass.class_attr的方式访问和打印类属性
- 静态方法是属于类的方法,而不是属于实例(对象)的方法。
- 它在定义时使用 @staticmethod 装饰器进行标识。
- 静态方法没有对类或实例的特定实例进行操作,因此它不需要访问类或实例的状态。
- 静态方法可以通过类名直接调用,而不需要创建类的实例。
- 静态方法没有 self 或 cls 参数,因此无法访问实例属性(self…),但是可以通过类名(CLS)访问和修改类属性(CLS…)。
- 静态方法适用于与类相关但不依赖于实例状态的操作,或者只是希望将方法封装在类的命名空间中的情况。
三、普通方法(Instance Method)
class Car:
# 类属性
manufacturer = "ABC Motors"
def __init__(self, model, year):
# 实例属性
self.model = model
self.year = year
# 普通方法
def get_age(self, current_year):
Car.manufacturer="从普通方法中改变 类属性"
self.manufacturer="从普通方法中改变 实例属性"
# print(manufacturer) #不能直接访问类属性
return current_year - self.year
# 创建 Car 类的实例
car1 = Car("SUV", 2020)
# 调用普通方法
age = car1.get_age(2023)
print(age) # 输出: 3
# print(Car.get_age("23")) #出错
print(car1.manufacturer) #输出:从普通方法中改变 实例属性
print(Car.manufacturer) #输出:从普通方法中改变 类属性
- 普通方法是属于实例(对象)的方法,它通过类的实例进行调用。
- 在类中定义方法时,默认情况下就是普通方法。
- 普通方法的第一个参数通常是 self,它表示对调用该方法的实例自身的引用。
- 普通方法可以通过实例(self)访问和修改实例属性(self…),
普通方法可以通过类名(CLS)访问修改类属性(CLS…)。
5.普通方法只能通过实例(self)调用,不能通过类名(CLS)调用- 普通方法通过实例调用时,自动将实例作为第一个参数传递给方法。
四、实例属性 与 类属性 的区别
实例属性是在类中函数定义的 self 开头的
类属性是在类中定义,但不是在函数中定义的。
class Car:
# 类属性
manufacturer = "ABC Motors"
def __init__(self, model, year):
# 实例属性
self.model = model
self.year = year
五、总结
- 类方法属于类,静态方法属于类,普通方法属于实例。
- 类方法通过类名或实例调用,静态方法通过类名或实例调用,普通方法只能通过实例调用。
- 类方法的第一个参数是 cls,静态方法没有特殊的参数,普通方法的第一个参数是 self。
- 类方法 :可以访问和修改类属性,不可以访问和修改实例属性
静态方法:可以通过类名访问或修改类属性;不能访问或修改实例属性
普通方法:普通方法可以通过实例访问和修改实例属性;普通方法可以通过类名访问和修改类属性。