Loading

类的特殊属性


__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

posted @ 2021-01-05 21:23  吃了好多肉  阅读(85)  评论(0编辑  收藏  举报