实现常见行为的方法和函数处理程序
good-handlers的Python项目详细描述
好的处理者
在不编写整个函数的情况下实现常见行为的方法和函数处理程序
处理程序
处理程序是在类中充当方法的对象。它们适用于可配置的预定义功能,否则这些功能将是多余的。处理程序功能是在标准python的__call__
方法中实现的,否则它将处理程序视为函数。
fromgood_handlersimportInstanceHandlerclassMyHandler(InstanceHandler):def__init__(self,scale):self._scale=scaledef__call__(self,instance,arg1,arg2):instance.result=scale*(arg1+arg2)
类InstanceHandler
绑定到实例。这需要额外的instance
参数,它将成为处理程序的绑定实例
fromgood_handlersimportInstanceHandlerclassMyHandler(InstanceHandler):def__init__(self,scale,save='last_result'):self._scale=scaleself._save=savedef__call__(self,instance,arg1,arg2):setattr(instance,self._save,scale*(arg1+arg2))classMyClass:def__init__(self):self.last_result=Nonehandler=MyHandler(3)
类ClassHandler
绑定到一个类,并将绑定的类传递给额外的klass
参数。
fromgood_handlersimportClassHandlerclassDefaultAgePersonMaker(ClassHandler):def__init__(self,defage):self._defage=defagedef__call__(self,klass,name):returnklass(name=name,age=self._defage)classPerson:make_twenty_year_old=DefaultAgePersonMaker(20)def__init__(self,name,age):self._name=nameself._age=agejim=Person.make_twenty_year_old('Jim Shim')# Makes Person('Jim Shim', 20)
初始化处理程序
冗余编程的一个特例是__init__
方法。通常,__init__
只用于设置一系列成员变量。因此,它们通常包含许多样板代码。好的库提供了几个__init__
处理程序,简化了创建__init__
方法的过程。NamedInitHandler
根据names
参数中提供的名称元组设置成员变量。
fromgood_handlers.initimportNameInitHandlerclassPerson:__init__=NameInitHandler(names=('name','age','apparel','thoughts'))
这些值的默认值可以在defaults
参数中作为dict提供。
fromgood_handlers.initimportNameInitHandlerclassPerson:__init__=NameInitHandler(names=('name','age','apparel','thoughts'),defaults={'apparel':'Pajamas','thoughts':'Nothing at the moment...'})
UnderscoreInitHandler
是一种NamedInitHandler
类型,在实例中设置每个名称之前,它会在每个名称后面附加一个下划线_
。DunderInitHandler
在每个名称前添加dunder或双下划线__
字符串处理程序
冗余编程的另一种情况是字符串表示。好的库提供ValueStringHandler
,它打印要显示的对象名和给定键的值,以及KeyValueStringHandler
,它类似于ValueStringHandler
,但显示键=值对,而不只是值
fromgood_handlers.stringimportValueStringHandler,KeyValueStringHandlerclassPerson1:""" Docstring for Person """def__init__(self,name,age):""" Initializes instance """self.name=nameself.age=age__repr__=ValueStringHandler(('name','age'))classPerson2:""" Docstring for Person2 """def__init__(self,name,age):""" Initializes instance """self.name=nameself.age=age__repr__=KeyValueStringHandler(('name','age'))john1=Person1('John Numberone',21)john2=Person2('John Numbertwo',28)print(john1)# prints 'Person1(\'John Numberone\', 21)'print(john2)# prints 'Person2(name=\'John Numbertwo\', age=28)'