Python3之对类的理解

本文详细解析了Python中类变量的概念与使用方法,包括类变量的访问途径、类的文档字符串及__slots__列表的限制作用。通过具体实例展示了类变量如何被类和其实例访问,以及__slots__如何限定实例属性。

#类
###类变量
类变量是类的属性,此属性属于类,不属于此类的实例
类变量的作用:通常用来存储该类创建对象的共有属性

说明:

  • 类变量可以通过该类直接访问
  • 类变量可以通过类的实例直接访问
  • 类变量可以通过此类的对象的__class__属性间接访问

举个栗子:

>>> class Human:
	total_count = 0

>>> Human.total_count += 1  # 通过该类直接访问类变量
>>> print(Human.total_count)
1
>>> peo1 = Human()  # 创建一个实例对象
>>> peo1.total_count += 1    # 通过该实例来访问类的变量
>>> print(peo1.total_count)
2
>>> 
>>> peo1.__class__.total_count += 100
>>> print(peo1.__class__.total_count)
101
>>> 

借助__class__实现一个小栗子:

class Human:
    total_count = 0  # 类变量,用来记录Human对象的个数

    def __init__(self, n):  # 初始化方法
        self.name = n
        self.__class__.total_count += 1
        print(n, '对象被创建')

    def __del__(self):
        print(self.name, '对象被销毁')
        self.__class__.total_count -= 1

L = []
L.append(Human('张飞'))
L.append(Human('关羽'))

print('当前人物个数是:', Human.total_count)
del L[1]
print('当前人物个数是:', Human.total_count)

运行结果:

张飞 对象被创建
关羽 对象被创建
当前人物个数是: 2
关羽 对象被销毁
当前人物个数是: 1
张飞 对象被销毁

####类的文档字符串

  • 类内第一个没有赋值给任何变量的字符串为类的文档字符串
  • 类的文档字符串可以通过help()查看
  • 类的文档字符串绑定在该类的__doc__属性上

举个栗子:

>>> class A:
	'''hahahahehehe'''
	pass

>>> help(A)
Help on class A in module __main__:

class A(builtins.object)
 |  hahahahehehe
 |  
 |  Data descriptors defined here:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)

>>> print(A.__doc__)
hahahahehehe

####类的__slots__列表
作用:

  • 限定一个类创建的实例只能有固定的属性(实例变量)
  • 不允许对象添加列表以外的实例属性(实例变量)
  • 防止用户因错写属性名而发生程序错误

说明:
__slots__属性绑定一个字符串类列表
含有__slots__属性的类所创建的实例对象没有__doc__属性,即此实例不用字典来存储数据

举个栗子:

class Human:
    __slots__ = ['name', 'age']  #限定只有列表内的实例变量,防止用户误写,如下边的Age
    def __init__(self, n, a):
        self.name = n
        self.age = a

    def info(self):
        print(self.name, '今年', self.age, '岁')

h1 = Human('小张', 8)
h1.info()  # 小张今年8岁

h1.Age = 9  # Age 没有此变量  错误信息:'Human' object has no attribute 'Age'
h1.info()  # 小张今年8岁

打印结果是:

小张 今年 8 岁
Traceback (most recent call last):
  File "C:/Users/.../slots.py", line 17, in <module>
    h1.Age = 9  # Age 没有此变量  错误信息:'Human' object has no attribute 'Age'
AttributeError: 'Human' object has no attribute 'Age'

从打印结果看,是没有Age这个变量的,那么如果不加__slots__是什么样的呢?
把__slots__ = [‘name’, ‘age’]注释后
打印结果:

小张 今年 8 岁
小张 今年 8 岁

虽然没报错,但是还是没有Age这个变量,所以,打印的结果和它没有关系

本节暂时到这

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秒不可闫M先生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值