15.私有属性、__dict__、__doc__、self和cls

私有属性
  • 类里面定义的变量叫做属性。而类属性有两种:共有属性和私有属性

  • 私有属性的定义
    单下划线开头:_attr (外部可访问)
    双下划线开头:__attr(外部无法访问)

  • Python中对属性的私有化,只是通过修改这个属性的名称来实现的。所以Python并没有真正的私有化支持,但可以使用下划线得到私有化。

  • 有一个大多数Python代码都遵循的原则:带有下划线前缀的名称,应该被视为非公开的API的一部分(无论数据、函数、方法)。它应该被视为实现细节,如果它有所更改,不需要另行通知。也就是说,不要去访问私有的数据

  • 代码演示

class TestClass(object):
    attr = 0
    _attr = 100
    __attr = 200  # 外部无法访问,因为被修改了名称,修改为:_TestClass__attr


# 访问类属性无需实例化,直接用类名进行访问
print(TestClass.attr)  # 0 外部可以访问
print(TestClass._attr)  # 100 外部可以访问
# print(TestClass.__attr)  # 报错,外部无法访问
print(TestClass._TestClass__attr)  # 200, 使用修改后的属性名称,可访问得到。


__dict__
  • 作用
    1.类直接调用object.__dict__:返回该类的属性和方法的字典
    2.实例调用object().__dict__:返回实例相关的属性和方法
  • 代码演示
class Hero(object):
    """
    我是类注释
    """
    id = 123

    def hero(self):
        """
        我是方法注释
        """
        pass


print(Hero.__dict__)  # 类调用__dict__
'''
{
{'__module__': '__main__', 
'__doc__': '\n    我是类注释\n    ', 
'id': 123, 
'hero': , 
'__dict__': , 
'__weakref__': }
}
'''
h = Hero()
h.name = 'Hero'
print(h.__dict__)  # {'name': 'Hero'}


__doc__
  • 作用
    1.类调用:打印类的注释
    2.方法调用:打印方法的注释

  • 使用方式(沿用上面例子的类)

print(Hero.__doc__)  # 我是类注释
print(h.__doc__)  # 我是类注释
print(Hero.hero.__doc__)  # 我是方法注释
print(h.hero.__doc__)  # 我是方法注释


self和cls的区别
  • self:实例对象本身
  • cls:类对象本身
class Hero1(object):
    def func(self):
        print('self=>', self)  # self=> <__main__.Hero1 object at 0x00000000022AB0B8>

    @classmethod
    def func1(cls):
        print('cls=>', cls)  # cls=> 


h1 = Hero1()
h1.func()
h1.func1()
self和cls的区别.png

你可能感兴趣的:(15.私有属性、__dict__、__doc__、self和cls)