python新式类

#-*-coding:utf-8-*-
'''
_slots_类属性
1._slots_是一个类变量,可以由一系列对象组成,使用所有合法标识构成的实例属性的集合表示,它也可以是一个列表,元组,或可迭代对象,总之,任何试图创建一个
其名不在_slots_中的实例属性的操作都将引发AttributeError异常
'''
class MyLimeter(object):
#MyLimeter是以object类为超类的。在__slots__类属性中,定义3个属性'myname','myage','myhoppy'
__slots__ = 'myname','myage','myhoppy'
# if __name__ =='__main__':
# #创建类实例
# x = MyLimeter()
# #调用属性,由于在实例属性被引用前必须赋值,所以会报错
# # x.myname
# #给属性赋值,__slots__类属性会防止用户随心所欲地动态添加实例属性,所以会报错
# # x.job = '白领'
# #修改代码
# x.myname = 'duochunyuan'
# print(x.myname)


'''
__getattribute__()特殊方法(只适用于新式类)
当属性不能再实例的__dict__,类的__dict__或者__dict__中找到时才被调用
适用情况:想要一个适当的函数来执行对每个属性的访问,而不仅仅是属性找不到的情况,这就需要使用__getattribute__()方法
代码描述:当实例对象myattribute访问属性member时,调用__getattribute__方法,并且判断该属性是否为test,很显然不是,则执行else代码块。由于属性member
在类MyAttribute中存在,因此没有调用__getattr__方法中的内容。当实例对象myattribute访问属性so时,又一次调用__getattribute__方法,进入__getattribute__
方法后进行判断并且执行相应的代码,由于属性so在MyAttribute类中不存在,因此调用__getattr__方法。在__getattr__方法中,当执行到self.default时,又调用
了一次__getattribute__方法,接着再次判断,并且执行else块中的代码,最后进行打印输出
'''
class MyAttribute(object):
def __init__(self):
self.default = 0.0
self.age = 20
self.member = 21

#使用__getattribute__方法来确定是不是对每个属性的访问都需要调用该方法,并且在该方法中使用if语句判断调用的属性是否为test,如果是则执行相应的代码块
def __getattribute__(self, name):
if name == 'test':
print('当调用的属性不是test时,经过__getattribute__方法%s'%name)
return self.test
else:
print('当调用的属性不是test时,打印输出的值%s'%name)
return object.__getattribute__(self,name)

#__getattr__方法来确定所创建的实例调用的属性是否在类中,若是不在会调用
def __getattr__(self, name):
print('经过__getattr__方法,打印输出的name值是:%s'%name)
print('打印出的原先设置的default值:%s'%self.default)
return self.default

if __name__ == '__main__':
myattribute = MyAttribute()
myattribute.member
myattribute.so

'''
描述符(新式类)
它为对象属性提供强大的API,其原理就是将某种特殊类型的类的实例指派给另一个类的属性包含的方法有__get__()、__set__()和__delete__()
__get__()用于得到一个属性的值
__set__()为一个属性赋值
__delete__()采用del语句或者明确删除某个属性时被调用

'''
class MyDescription(object):
def __get__(self, obj, typ=None):
print('__get__方法,oby是:%r,typ是:%r'%(obj,typ))
return self.data
def __set__(self, obj, val):
print('__set__方法,oby是:%r,val是:%r'%(obj,val))
self.data = val
def __delete__(self, obj):
print('__delete__方法,obj是%r'%obj)
del self.data
class MyDesClass(object):
this = MyDescription()
that = MyDescription()
other = 4

mydesclass = MyDesClass()
mydesclass.this = 'nishiwodeweiyi'
print(mydesclass.this)
print('我是打印出类MyDesClass中other的值:',mydesclass.other)
mydesclass.other = 6
print('我是打印出重新赋值给other的值:',mydesclass.other)

转载于:https://www.cnblogs.com/askill/p/10213250.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值