python新式类

Posted 点滴听滴答

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)




















































































以上是关于python新式类的主要内容,如果未能解决你的问题,请参考以下文章

python之新式类与经典类

python基础===新式类与经典类

python 新式类和经典类(了解)

Python新式类

Python新式类 单例模式与作用域

Python新式类与经典类的区别