Python学习笔记(十三):类属性、类方法以及静态方法的用法

本文详细介绍了Python面向对象编程中的类属性、实例属性、类方法和静态方法。类属性被所有实例共享,可通过类或实例访问;实例属性属于特定对象,实例化时创建。类方法使用`@classmethod`修饰,第一个参数为类对象,常用于类属性的访问与修改;静态方法使用`@staticmethod`修饰,不依赖于类或实例,常用于与类或实例无关的辅助功能。文章通过示例展示了各种方法的使用场景及效果。

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

1.类属性

1.1.类属性与实例属性的定义

  • 类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本。 对于公有的类属性,在类外可以通过类对象和实例对象访问。
  • 实例属性即对象属性

具体用法,如下:

# 定义一个Person类
class Person(object):
    # 类属性
    country = "中国"
    # 构造方法
    def __init__(self, name, age):
        # 实例属性
        self.name = name
        self.__age = age

    # 返回私有属性__age的值
    def get_age(self):
        return self.__age

    # 实例方法
    def speak(self):
        print("我的名字叫{},我今年{}岁啦".format(self.name, self.get_age()))

# 实例化一个Person类对象
p = Person("crystal", 18)
# 通过对象名访问类属性,对象名.类属性
print("我的国家是:", p.country)
# 通过类访问类属性,类.类属性
print("我的国家是:", Person.country)
p.speak()

输出结果如下:

我的国家是: 中国
我的国家是: 中国
我的名字叫crystal,我今年18岁啦

1.2.修改类属性

如果需要在类外修改类属性,必须通过类去引用然后进行修改。 如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性, 并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。

1.2.1.通过实例对象修改类属性

# 通过实例对象修改类属性,会产生一个同名的实例属性
p.country = "china"
# 实例属性会屏蔽掉同名的类属性
print(p.country)
# 类属性不会受到影响,仍然会输出:中国
print(Person.country)
# 删除实例属性
del p.country
# 以下两条均输出:中国
print(p.country)
print(Person.country)

1.2.2.通过类名修改类属性

# 通过类名修改类属性
Person.country = "毛茸茸国"
# 以下两条均输出:毛茸茸国
print(p.country)
print(Person.country)

2.类方法

类方法是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法, 对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数,能够通过实例对象和类对象去访问。

# 定义一个Person类
class Person(object):
    country = "中国"
    # 类方法,使用classmethod进行修饰
    @classmethod
    def get_country(cls):
        return cls.country

    # 类方法
    @classmethod
    def set_country(cls, country):
        cls.country = country

# 实例化一个对象
p = Person()
# 通过实例对象调用类方法,对象名.类方法
print(p.get_country())

print("**" * 10)

# 使用类方法修改类属性的值
p.set_country("China")
# 通过实例对象调用类方法,对象名.类方法
print(p.get_country())
# 通过类调用类方法,类名.类方法
print(Person.get_country())

输出结果如下:

中国
********************
China
China

从以上结果可以看出,使用类方法修改类属性的值之后,接着使用类和实例对象访问类方法,类属性的值都发生了变化。 

 3.静态方法

静态方法需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数,可以通过对象和类来访问。
'''
静态方法需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数,可以通过对象和类来访问。
'''
class Person(object):
    country = "China"

    # 静态方法
    @staticmethod
    def get_country():
        return Person.country

# 实例化一个对象
p = Person()

# 通过实例对象调用静态方法
print(p.get_country())

# 通过类调用静态方法
print(Person.get_country())

输出结果如下:

China
China

4.总结

  • 从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;
  • 实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。
  • 静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类实例对象来引用
1.实例方法(对象方法) --> 场景很多
    调用格式: 对象名.实例方法名()
    使用场景: 在方法中需要self
        
2.类方法 --> 对私有类属性取值或者赋值
    定义格式: @classmethod
              def 类方法名(cls):
    调用格式: 类名.类方法名()  或者 对象名.类方法名()
    使用场景: 在方法中需要cls类名
        
3.静态方法 --> 一般不用
    定义格式: @staticmethod
              def 静态方法名():
    调用格式: 类名.类方法名() 或者 对象名.类方法名()
    使用场景: 在方法中不需要self 也不需要cls  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蝌蚪找玛玛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值