python类属性、类方法、静态方法

类属性

        类属性就是类拥有的属性,我们之前看到在__init__所定义的属性那是实例属性,

类属性是对所有对象公开的,每一个人都可以取调用它,当我们的实例属性以及值都相同的时候,我们可以直接定义一个类属性,因为,这样所创建的实例都引用了类属性这一块内存地址,这节约了内存空间,

案例:

class Person(object):
    pass

class Chinese(Person):
    # 类属性
    home = '中华人民共和国'

c1 = Chinese()
c2 = Chinese()
# 我们可以看到id是一样的,证明公用的是一块内存
print(id(Chinese.home))
print(id(c1.home))
print(id(c2.home))

结果:

我们可以看到,这三个对象的内存地址都是一样的,这样就可以说明引用了同一块内存空间,更加的节约了资源。

需求:

        假设我们现在给你个对象赋予类属性相同的值,会发生什么事情呢?

案例:

class Person(object):
    pass

class Chinese(Person):
    home = '中华人民共和国'

c1 = Chinese()
c2 = Chinese()

# 修改了c1对应的类属性, c2 会不会发生变化
# 这里其实是一个障眼法,下方代码是给c1添加了一个叫做home的实例属性
# 当我们调用一个对象的属性时,如果类属性和实例属性同名优先调用实例属性

# 底层还是内存地址的问题

c1.home = '中国'
print(c1.home)  # 中国
print(c2.home)  # 中华人民共和国
print(Chinese.home) # 中华人民共和国

结果:

         

        我们可以看到,虽然给c1对象赋了一个和name值,和类属性相同,但是并不是把类属性的值给改变了,只是给,ci对象赋了一个name属性,当对象和类有相同的属性时候,对象优先调用实例属性,所以我们看到c1的name属性虽然改变了,但只c2的值还是原来的值

规定

        虽然对象也可以调用类属性,但是可能发生一些错误,所以类属性我们一般都是用类名调用,实例属性用对象调用,这样更加见名之意。  

补充

        资源就是我们的内存,内存资源是非常珍贵的,他决定你的后台可以开启多少程序任务,如果内存溢出了,可能会导致任务执行不了,平台崩塌等。

类方法

        类方法跟实例方法大同小异,我们在属性方法上面加一个@classmeethod装饰器,那么他就是类方法。

 为什么要有类方法?

        在类中的方法,方法体不需要调用对象,但是我们需要调用类的属性,或者说需要用到类,此刻我们就可以使用类方法,话不多说,上案例。

案例:

# - 类方法,就是不依赖于实例,在方法中只使用了类属性或者类方法,不使用实例属性或实例方法。
# - 类方法,定义时需要在上方添加@classmethod, 在定义类方法时,会自动提示cls,代表调用该类方法的类本身
# - 类方法调用时建议使用类名,不建议使用实例,调用类方法时,会自动将调用该方法的类传入方法内部。

class Person(object):
    __count = 0

    def __init__(self):
        Person.__count += 1

    @classmethod
    def get_person_count(cls):
        #返回类的私有属性
        return cls.__count


p = Person()
p2 = Person()
# 类的方法也是用类调用
print(Person.get_person_count()) 

结果: 

        类方法的第一个参数也是自动传入的,和实例属性一样,不需要手动传入。

静态方法

        在类中,我们不需要使用类和对象,那么我们就可以使用静态方法来装饰,

        创建方式跟类方法一样,都是在类中的方法上面添加一个装饰器,但是这次添加的是@staticmethod

为什么还会有静态方法呢?

因为虽然这个方法不需要对象和类,但是与整个类有逻辑关系,所以还是必须有的。

案例:

# - 静态方法需要使用@staticmethod进行修饰
# - 静态方法,既不依赖于类,也不依赖于对象
# - 静态方法中不会自动传入cls或者self
# - 静态方法与类有逻辑关系

# 使用场景: 当我们定义的方法内部不需要调用实例和类时,可以定义为静态变量

class Person(object):
    # 此刻因为方法体中没有用到实例对象
    # 也没有用到类方法
    # 此刻我们就可以将此方法定义为静态方法
    @staticmethod
    def eat():
        print('我要吃很多')

# 建议通过类名调用静态方法,不建议使用实例名称
Person.eat()

以上就是全部内容,如有不妥之处,忘指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值