类的特殊属性
__doc__
类名.__doc__
时触发执行,查看类的注释信息,注释信息无法继承。
class Person:
"""
该类注释信息
"""
print(Person.__doc__)
该类注释信息
直接写注释信息相当于定义了个__doc__ = """该类的注释信息"""
,所以可以不用写pass,语法也是正确的。
__name__
类名.__name__
时触发执行,返回类名。
class A:
pass
a = A()
print(type(a).__name__)
A
__module__
对象.__module__
时触发执行,返回对象所在的模块名。
class A:
pass
a = A()
print(A.__module__)
__main__ # 表示当前文件
__class__
仅新式类中,对象.__class__
时触发执行,返回对象所属的类。与type()所得到的结果相同。
class A:
pass
a = A()
print(A.__class__)
print(a.__class__)
print(type(a))
<class 'type'>
<class '__main__.A'>
<class '__main__.A'>
__slots__
slots是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性)。
使用点来访问属性本质就是在访问类或者对象的dict属性字典(类的字典是共享的,而每个实例的是独立的)。
class People:
__slots__ = ['name','age']
def __init__(self,name,age):
self.name = name
self.age = age
p = People('libai',18,)
# p.sex = 'male' 对象不能再定义独自的属性
# print(p.__dict__) 使用了slots,对象就没有__dict__
print(p.__slots__) # 可以查看类的__slots__属性.
__slots__
的作用:
- 1、限制对象的属性。
- 2、当实例很多,但属性很少,使用slots能节省内存。
类每生成一个对象,对象有自己的dict,如果对象自身有很多属性,(对象越多)这样占用的内存空间就很多,使用了slots后,所有的对象,都使用类名称空间中的属性,对象越多,越节省内存。
#python为类内置的特殊属性
类名.__name__ # 类的名字(字符串)
类名.__base__ # 类的第一个父类
类名.__bases__ # 类所有父类构成的元组,仅查看直接父类。
类名.__dict__ # 类的属性字典
参考文档:
https://docs.python.org/zh-cn/3/reference/datamodel.html?highlight=eq#object.eq