获取私有属性
#coding:utf-8
class Test(object):
def __init__(self, name):
self.__name = name # 类的属性私有化
a = Test('laowang')
# a.__name 正常访问无法获取私有属性,因为python名字重整
print(a.__dict__) # 查找私有属性重整后的名字 {'_Test__name': 'laowang'}
print(a._Test__name) # laowang
a.__name = 'xxxx' # dict里面重新添加属性(公有)
print(Test.__dict__)
魔法属性
1、__doc__
- 表示类的描述属性
#coding:utf-8
class Foo:
'''描述类信息,这是用于看片的神器'''
def func(self):
pass
print(Foo.__doc__)
# 输出:描述类信息,这是用于看片的神器
2、__module__ 和 __class__
- __module__表示当前操作的对象在那个模块
- __class__表示当前操作的对象的类是什么
# coding:utf-8
class Person(object):
def __init__(self):
self.name = '老王'
# coding:utf-8
from Test import Person
obj = Person()
print(obj.__module__) # 输出 test 即:输出模块名
print(obj.__class__) # 输出 <class 'Test.Person'> 即:输出类名
3、__init__
- 初始化方法,通过创建对象时,自动触发执行
- 构建方法 = 构建 + 初始化,__init__只是初始化 + __new__方法 = 构造方法
# coding:utf-8
class Person:
def __init__(self, name):
self.name = name
self.age = 18
obj = Person('老王') # 自动执行类中的__init__方法
4、__del__
- 当对象在内存中被释放时,自动触发
# coding:utf-8
class Foo:
def __del__(self):
pass
5、__call__
- 对象后面加括号,自动触发
# coding:utf-8
class Foo:
def __init__(self):
pass
def __call__(self, *args, **kwargs):
print('__call__')
obj = Foo() # 执行 __init__
obj() # 执行 __call__
6、__str__
- 如果一个类定义了__str__方法,那么在打印对象时,默认输出方法的返回值
# coding:utf-8
class Foo:
def __str__(self):
return 'laowang'
obj = Foo()
print(obj) # 当前对象的描述是:%s %obj 调用__str__方法
# 输出: laowang
8、__getitem__、__setitem__、__delitem__
- 用于索引操作,如字典。以上分别表示获取、设置、删除数据
# coding:utf-8
class Foo(object):
def __getitem__(self, key):
print('__getitem__', key)
def __setitem__(self, key, value):
print('__setitem__', key, value)
def __delitem__(self, key):
print('__delitem__', key)
obj = Foo()
# 把obj对象当成字典对象[]
result = obj['K1'] # 自动触发执行__getitem__
obj['K2'] = 'laowang' # 自动触发执行__setitem__
del obj['K1'] # 自动触发执行__delitem__
9、__getslice__、__setslice__、delslice
- 该方法用于分片操作,如:列表
# coding:utf-8
class Foo(object):
def __getslice__(self, i, j):
print('__geslice__', i, j)
def __setslice__(self, i, j, sequence):
print('__setsilce__', i, j)
def __delslice__(self, i, j):
print('__delslice__', i, j)
obj = Foo()
obj[-1:1] # 自动触发执行__getslice__ 获取
obj[:1] = [11, 22, 33, 44] # 自动触发执行__setslice__ 替换
del obj[:2] # 自动触发执行__delslice__ 删除