Python 装饰器重载内置操作

小夏 科技 更新 2024-01-30

python2.x 和 python3 的现代类所有具有内置动作表达式调用的 x 类都不会触发 getattr(和 getattribute)(参见 Python 的 getattr 和 getattribute 拦截内置操作)。

强制:表示强制类型转换,当您使用加法(或连接)操作+时,不同的类型会触发类型转换或报错。

内置操作调用模式:隐式调用,即调用表达式; 显式调用,这是被调用方法的名称。

描述:

内置操作的表达式调用在 python3 中不可用0 个委托,因为不会触发 getattr(和 getattribute)

>>def tracecall(*args):跟踪调用。 

if trace:

print('['+','.join(map(str,args))+']')

>def accessctrl(forbid):

def ondecorator(acls):

class oninstance:

def __init__(self,*args,**kargs):

self.__wrapped=acls(*args,**kargs)

def __getattr__(self,attr):

tracecall('getattr',attr)

if forbid(attr):

raise typeerror('禁止访问:'+attr)

else:return getattr(self.__wrapped,attr)

def __setattr__(self,attr,value):

tracecall('setattr',attr,value)

压缩变量命名为 oninstance wrapped

if attr=='_oninstance__wrapped':

self.__dict__[attr]=value

elif forbid(attr):

raise typeerror('禁止设置:'+attr)

else:setattr(self.__wrapped,attr,value)

return oninstance

return ondecorator

>def privateattr(*privates):

return accessctrl(forbid=(lambda attr:attr in privates))

>privateattr('phone')

class staff_private:

def __init__(self,name,phone):

self.name=name

self.phone=phone

def __str__(self):

return '员工私人>电话号码:'+str(self.phone)

def __add__(self,num):

self.phone+=num

python2.x 执行py2 的 getattr (截获对 print() 和 + 等内置操作的表达式调用,并正确地委托给装饰对象。

#python2.x 执行

>trace=true

>sp1=staff_private('梯形图读取线',110)

setattr,oninstance 包装,员工私人>电话号码:110]。

py2 遗留类拦截内置操作表达式调用 - 隐式调用、print()。

>print(sp1)

getattr,__str__]

员工私人>电话号码:110

py2 传统类拦截内置操作表达式调用 - 隐式调用,+

>sp1+1

getattr,__coerce__]

getattr,__add__]

>print(sp1)

getattr,__str__]

员工私人>电话号码:111

python3.x 执行py3 的 getattr(它不会拦截对 print() 和 + 等内置操作的表达式调用),不能委托给装饰对象。

#python3.x 执行

>trace=true

>sp1=staff_private('梯形图读取线',110)

setattr,oninstance 包装,员工私人>电话号码:110]。

py3 不会拦截内置操作打印

>print(sp1)

_main__.accessctrl..ondecorator..oninstance object at 0x0000019736c2f4f0>

py3 不拦截内置操作 +

>sp1+1

traceback (most recent call last):

file "", line 1, in

sp1+1typeerror: unsupported operand type(s) for +:'oninstance' and 'int'

描述:python3.X 的装饰器重载内置的操作运算符方法,以截获装饰类的内置表达式调用。

例如,重载 str (intercept print(), add (intercept +.

>>def tracecall(*args):跟踪调用。 

if trace:

print('['+','.join(map(str,args))+']')

>def accessctrl(forbid):

def ondecorator(acls):

class oninstance:

def __init__(self,*args,**kargs):

self.__wrapped=acls(*args,**kargs)

def __getattr__(self,attr):

tracecall('getattr',attr)

if forbid(attr):

raise typeerror('禁止访问:'+attr)

else:return getattr(self.__wrapped,attr)

def __setattr__(self,attr,value):

tracecall('setattr',attr,value)

压缩变量命名为 oninstance wrapped

if attr=='_oninstance__wrapped':

self.__dict__[attr]=value

elif forbid(attr):

raise typeerror('禁止设置:'+attr)

else:setattr(self.__wrapped,attr,value)

print() 触发 str (

def __str__(self):

tracecall('oninstance,__str__')

str() 触发 str(

return str(self.__wrapped)

+ 触发器添加 (

def __add__(self,other):

tracecall('oninstance,__add__',other)

return self.__wrapped+other

return oninstance

return ondecorator

>def privateattr(*privates):

return accessctrl(forbid=(lambda attr:attr in privates))

>privateattr('phone')

class staff_private:

def __init__(self,name,phone):

self.name=name

self.phone=phone

def __str__(self):

tracecall('staff_private,__str__')

return '员工私人>电话号码:'+str(self.phone)

def __add__(self,num):

tracecall('staff_private,__add__',num)

self.phone+=num

>trace=true

>sp1=staff_private('梯形图读取线',110)

staff private, str ] tracecall call print() 触发 str (

setattr,oninstance 包装,员工私人>电话号码:110]。

print() 触发 str (

>print(sp1)

oninstance,__str__]

staff_private,__str__]

员工私人>电话号码:110

+ 触发器添加 (

>sp1+1

oninstance,__add__,1]

staff_private,__add__,1]

>print(sp1)

oninstance,__str__]

staff_private,__str__]

员工私人>电话号码:111

相似文章

    Python 函数装饰器保存信息

    Python 函数装饰器可以通过实例属性 全局变量 非局部变量和函数属性来存储修饰函数的状态信息。描述 通过装饰器统计函数调用次数,并通过打印跟踪调用历史记录。此装饰器是使用类的 call 方法实现的。 装饰器返回实例对象 构造函数初始化调用次数为,并记录传入的修饰函数 重载调用 方法,每次调用一次...

    Python中魔法的奥秘 装饰器和闭包的解密

    Python是一种神奇的编程语言,它的魅力不仅体现在它简洁的语法和强大的标准库上,还体现在它灵活强大的高级功能上。在本文中,我们将深入探讨 Python 的两个神秘功能,装饰器和闭包,并揭示它们的工作原理和使用方式。.装饰器的基础。..什么是装饰器?装饰器是 Python 中一种特殊类型的函数,可用...

    如何选择装饰材料?装饰材料的选择及其应用

    在装修设计过程中,装修材料的选择是最重要的环节之一。选择建筑材料时需要考虑几个因素。这包括对装饰预算 设计要求和整体风格的考虑。这里有一些建议可以帮助您更好地选择装饰材料。.考虑你的装修预算。不同的装修材料 差异很大,所以首先要做的就是确定你的预算。在保证质量和环保的前提下,根据预算选择最有选择性的...

    格栅上装饰什么好? 格栅装饰指南

    作为家居装饰的元素之一,格栅不仅起到了实用的分隔作用,还增加了室内美感。以下是不同格栅装饰的一些提示和技巧。一 装饰格栅的原理 .统一风格 装潢应与室内的整体风格相协调。.功能合适 考虑格栅的实际功能,选择合适的装饰。.个性表达 体现个人品味和生活态度。二 不同类型格栅装饰 .木格栅 植物装饰 攀缘...

    装饰工程造价 装饰装修工程施工

    装饰工程材料。.饰面材料。.饰面石材。 天然饰面石材。 花岗岩板。花岗岩板是花岗岩经锯切 研磨 切割等工艺制成。花岗岩板坚硬致密,抗压强度高,耐磨性优良,化学稳定性好,不易风化,耐久性好 但是,由于花岗岩中含有石英,在高温下会发生晶型转变,导致体积膨胀,因此,花岗岩板的耐火性较差。根据现行国家标准 ...