第六章 Python面向对象 05-类属性与类方法

类属性是属于类的,所有对象共享,如`Person.count`。类方法使用`@classmethod`修饰,可以通过类或对象调用,但不能访问对象属性。静态方法用`@staticmethod`修饰,不接收特殊参数,同样可通过类或对象调用,常用于工具类。示例中展示了这些概念的使用。

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

类属性与类方法

类属性

顾名思义,就是属于“类”的属性。我们之前在类中定义的属性都是属于“对象“的,随着对象的创建而创建,随着对象的销毁而销毁。并且不同的对象是互不干扰的。但是类属性不然,类属性是属于类的,随着类的定义加载到静态池中,被所有的对象所共享!

类属性与对象属性的区别:

  • 开辟时机不同:
    • 对象属性是随着对象的实例化而开辟在堆中的,随着对象的销毁而销毁的。
    • 类属性是随着类的定义被开辟在静态池中的。
  • 所属主体不同:
    • 对象属性是属于对象的,不同的对象的属性彼此独立,互不影响。
    • 类属性是被所有的对象共享的。
# @Author   : 大数据章鱼哥
# @Company  : 北京千锋互联科技有限公司


class Person:
    # 直接在类内写的属性,就是类属性
    # 这个属性,被所有的对象共享
    # 不可变的数据类型
    count = 0
    # 可变的数据类型
    friends = []


# 创建类的对象
p1 = Person()
print(id(p1.count))
p2 = Person()
print(id(p2.count))

# 尝试使用对象来修改类属性(不可变的类型)
# p1.count = 10
# print(id(p1.count))     # 其实是对p1开辟了一个新的空间,修改了p1.count的地址指向
# print(id(p2.count))

p1.friends.append('zhangsan')       # 其实这里并没有对属性进行修改,存储的依然是指向一个数据容器内存空间的地址
print(id(p1.friends), p1.friends)
print(id(p2.friends), p2.friends)

# 正确的类属性访问方式:使用类来访问
Person.count = 20
print(p1.count, p2.count)

2. 类方法

类方法就是“属于类”的方法,在定义的时候需要使用**@classmethod**来修饰,同时必须要有一个特殊的参数cls。调用方法的时候,可以使用类来调用,也可以使用对象来调用。但是更加推荐使用类来调用。

需要注意:在类方法中,由于没有对象传入,因此无法直接访问到当前类的对象属性,只能够访问到类属性。

class Person:
    # 定义类属性
    __count = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def count_of_person(cls):
        """
        类方法使用 @classmethod 修饰
        在调用的时候,cls表示调用的类,注意不是对象!
        :return:
        """
        print(Person.__count)       # 可以访问到类属性
        # print(Person.name)        # 因为没有对象传入,因此无法直接访问到对象的属性


# 使用类来调用,Python解释器会自动的将Person类传递给参数cls
Person.count_of_person()

# 使用对象来调用,Python解释器会自动的将对象所对应的类传递给参数cls【不推荐】
x = Person("xiaoming", 12)
x.count_of_person()

3. 静态方法

静态方法也是属于类的方法,与类方法类似,但是在定义和使用的时候与类方法还是有点区别的:

  • 使用 @staticmethod 装饰器来修饰
  • 不需要特殊的参数,例如cls、self等
class Person:
    # 定义类属性
    __count = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age

    @staticmethod
    def count_of_person():
        """
        静态方法使用 @staticmethod 修饰
        :return:
        """
        print(Person.__count)       # 可以访问到类属性
        # print(Person.name)        # 因为没有对象传入,因此无法直接访问到对象的属性


# 使用类来调用
Person.count_of_person()

# 使用对象来调用
x = Person("xiaoming", 12)
x.count_of_person()

静态方法常见于工具类的封装

class Tool:
    @staticmethod
    def get_sum(*args, **kwargs):
        # 将所有的数字合并到一个元组中
        data = args + tuple(kwargs.values())
        # 定义变量,用来记录累加的结果
        res = 0
        # 累加
        for ele in data:
            res += ele
        return res

    @staticmethod
    def is_prime_number(number):
        if number < 2:
            return False
        for i in range(2, (number // 2) + 1):
            if number % i == 0:
                return False
        return True


# 工具类的使用
print(Tool.get_sum(99, 100, 98, chinese=99, math=89, english=100, mysql=90, python=90))
print(Tool.is_prime_number(99))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值