类方法与静态方法与普通方法、 实例属性与类属性

文章详细介绍了Python中类方法、静态方法和普通方法的定义、使用及区别。类方法通过@classmethod装饰器定义,可修改类属性,不直接访问实例属性。静态方法通过@staticmethod装饰器定义,不接收self或cls参数,无法直接访问实例或类属性。普通方法通过self访问实例属性,可通过类名访问类属性。此外,文章还阐述了实例属性与类属性的概念和区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



前言

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

  1. get_manufacturer() 是一个类方法,用于获取汽车制造商的名称。它可以通过类名或实例调用。
  2. calculate_mileage() 是一个静态方法,用于计算汽车的行驶里程。它可以通过类名或实例调用。
  3. 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())# 输出: 在类方法中通过类名修改类属性


  1. 类方法是属于的方法,而不是属于实例(对象)的方法。
  2. 它在定义时使用 @classmethod 装饰器进行标识。
  3. 类方法的第一个参数通常是 cls它表示对类自身的引用,类似于实例方法中的 self。
  4. 类方法可以通过类名直接调用,也可以通过实例调用。当通过实例调用时,类方法会自动将类作为第一个参数传递给方法。
  5. 类方法可以通过类名(cls/CLS)访问和修改类属性(cls/CLS…),但不能访问实例属性(self…)
  6. 类方法通常用于在不需要访问实例状态的情况下对类进行操作,或者在创建实例之前对类进行一些初始化操作

二、静态方法(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的方式访问和打印类属性
  1. 静态方法是属于类的方法,而不是属于实例(对象)的方法。
  2. 它在定义时使用 @staticmethod 装饰器进行标识。
  3. 静态方法没有对类或实例的特定实例进行操作,因此它不需要访问类或实例的状态。
  4. 静态方法可以通过类名直接调用,而不需要创建类的实例。
  5. 静态方法没有 self 或 cls 参数,因此无法访问实例属性(self…),但是可以通过类名(CLS)访问和修改类属性(CLS…)
  6. 静态方法适用于与类相关但不依赖于实例状态的操作,或者只是希望将方法封装在类的命名空间中的情况。

三、普通方法(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)  #输出:从普通方法中改变 类属性

  1. 普通方法是属于实例(对象)的方法,它通过类的实例进行调用。
  2. 在类中定义方法时,默认情况下就是普通方法。
  3. 普通方法的第一个参数通常是 self,它表示对调用该方法的实例自身的引用。
  4. 普通方法可以通过实例(self)访问和修改实例属性(self…),
    普通方法可以通过类名(CLS)访问修改类属性(CLS…)

    5.普通方法只能通过实例(self)调用,不能通过类名(CLS)调用
  5. 普通方法通过实例调用时,自动将实例作为第一个参数传递给方法

四、实例属性 与 类属性 的区别

实例属性是在类中函数定义的 self 开头
类属性是在类中定义,但不是在函数中定义的

class Car:
    # 类属性
    manufacturer = "ABC Motors"
    
    def __init__(self, model, year):
        # 实例属性
        self.model = model
        self.year = year

五、总结

  1. 类方法属于类,静态方法属于类,普通方法属于实例
  2. 类方法通过类名或实例调用,静态方法通过类名或实例调用,普通方法只能通过实例调用。
  3. 类方法的第一个参数是 cls,静态方法没有特殊的参数,普通方法的第一个参数是 self
  4. 类方法 :可以访问和修改类属性,不可以访问和修改实例属性
    静态方法:可以通过类名访问或修改类属性;不能访问或修改实例属性
    普通方法:普通方法可以通过实例访问和修改实例属性;普通方法可以通过类名访问和修改类属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值