Python魔法方法
lei.py
class Cat:
#使用__doc__可查看说明
'''
这是一个猫的类
'''
def __init__(self,name,tail_length=10): #构造函数 初始化时执行
self.name = name
self.tail_length = tail_length
self.__privatename = name #私有属性 被保护的变量
print('我是一只小猫,我的名字叫'+self.name)
def __del__(self): #析构函数 删除del时执行
print('%s被删除了'%self.name)
def __call__(self, *args, **kwargs):
print('cat:',sum(args))
def __str__(self):
return '我是一只叫'+self.name+'的猫'
def __len__(self):
return self.tail_length
def __iter__(self):
return iter([1,2,3,4]) #返回一个迭代器
def __getitem__(self, key): #使对象属性具备字典获取的功能
if key == 'name':
return self.name
else:
return None
def __setitem__(self, key, value): #使对象属性具备字典修改的功能
if key == 'name':
self.name = value
def __delitem__(self, key): #使对象属性具备字典删除的功能
if key == 'name':
del self.name
def __add__(self, other): #使对象具有相加的功能 出现加号就运行此代码
if isinstance(other,Cat):
return [self.name,other.name]
elif isinstance(other,list):
other.append(self.name)
return other
def __mul__(self, other):
return '我俩是'+self.name+other.name
test.py
from lei import Cat
aa = Cat('小困子')
print(aa.__doc__) #查看类的说明
print(aa.__module__) #查看类所在位置
print(aa.__class__) #查看对象所属类
aa(1,2,3,4,5,6,7,8,9,10) #__call__方法使对象可以被调用
print(callable(aa)) #查看对象是否可以被调用
print(aa.__dict__) #查看对象所有的属性 私有属性亦可被访问
print(aa._Cat__privatename) #私有属性访问方法加_类名
#__str__()魔法方法
print(str(aa)) #__str__使对象被print(str())时执行def __str__(self)下的return语句
print(aa) #__str__使对象被print时执行def __str__(self)下的return语句
#__len__()魔法方法
print(len(aa)) #__len__使对象在被len()时执行__len__()下的return语句
#__iter()__魔法方法 迭代器 使对象可以被迭代
for i in aa:
print(i)
#字典的修改、删除操作
dic = {'name':'xiaokunzi','age':25,'sex':'girl'}
print(dic)
dic['name'] = 'xiaopazi'
print(dic)
del dic['age']
print(dic)
print(aa['name']) #__getitem__(self, key)使其具备字典获取的功能
aa['name'] = 'kunkun' #__setitem__(self, key, value)使其具备字典修改的功能
print(aa.__dict__)
'''
del aa['name'] #__delitem__(self, key)使其具备字典删除的功能
print(aa.__dict__)
'''
#数学运算 +-*/ 魔法方法
#__add__() +
#__sub__() -
#__mul__() *
#__div__() /
#__mod__() %
#__pow__() **
x = 1
y = 2
print(x+y)
aa1 = Cat('小耙子')
bb1 = Cat('小黄子',20)
print(aa1 + bb1) #__add__(self, other)使类的对象具有相加的功能
cc1 = Cat('kunkunzi')
he = aa1 + bb1
print(cc1 + he)
print(aa1 * bb1)
运行结果:
我是一只小猫,我的名字叫小困子
这是一个猫的类
lei
<class 'lei.Cat'>
cat: 55
True
{'name': '小困子', 'tail_length': 10, '_Cat__privatename': '小困子'}
小困子
我是一只叫小困子的猫
我是一只叫小困子的猫
10
1
2
3
4
{'name': 'xiaokunzi', 'age': 25, 'sex': 'girl'}
{'name': 'xiaopazi', 'age': 25, 'sex': 'girl'}
{'name': 'xiaopazi', 'sex': 'girl'}
小困子
{'name': 'kunkun', 'tail_length': 10, '_Cat__privatename': '小困子'}
3
我是一只小猫,我的名字叫小耙子
我是一只小猫,我的名字叫小黄子
['小耙子', '小黄子']
我是一只小猫,我的名字叫kunkunzi
['小耙子', '小黄子', 'kunkunzi']
我俩是小耙子小黄子
kunkun被删除了
小耙子被删除了
小黄子被删除了
kunkunzi被删除了