我有2个python类,其功能相同,不同之处在于属性名称不同。
pythonic是什么,为什么只在一个类中具有功能,并更改属性名称?
class ItemA(A):
obj_name = 'itema_obj'
t1 = 5
def __init__(self, itema_obj=None, itema_type=None, attrs=None):
self.itema_type = itema_type
super().__init__(obj=itema_obj, attrs=None)
def get_context(self, name, value, attrs):
context = super().get_context(name, value, attrs)
if self.obj and self.obj.additional_itema_types and self.itema_type:
if self.itema_type in self.obj.additional_itema_types:
context['itema_obj'].itema = self.obj.additional_itema_types[self.itema_type]
return context
class RunC(A):
obj_name = 'runc_obj'
tr = 6
def __init__(self, runc_obj=None, runc_type=None, attrs=None):
self.runc_type = runc_type
super().__init__(obj=runc_obj, attrs=None)
def get_context(self, name, value, attrs):
context = super().get_context(name, value, attrs)
if self.obj and self.obj.additional_runc_types and self.runc_type:
if self.runc_type in self.obj.additional_runc_types:
context['runc_obj'].runc = self.obj.additional_runc_types[self.runc_type]
return context
答案 0 :(得分:2)
注意事项:在尝试在单个类中进行重构之前,请问自己是否重复是偶然的还是真的只是重复。我所说的“偶然”是指ATM的实现方式几乎是相似的,但这主要是巧合,未来的变化可能会使它们有所不同。因此,请考虑可能导致这些类发生更改的原因,并且这些更改将始终以相同的方式影响它们或使它们发生分歧,并且在最后一种情况下,请勿尝试将它们排除在单个类之外,因为这样做只会浪费时间。
现在可以进行第一次重构(显然尚未经过测试):
class Common(A):
obj_name = NotImplemented
types_name = NotImplemented
context_attname = NotImplemented # .runc or .itema
def __init__(self, obj=None, type_=None, attrs=None):
self.type_ = type_
super().__init__(obj=obj, attrs=None)
def _get_additional_context(self):
if not self.obj:
return None
if not self.type_:
return None
additionals = getattr(self.obj, self.types_name, None)
if not additionals:
return None
return additionals[self.type_]
def get_context(self, name, value, attrs):
context = super().get_context(name, value, attrs)
additionals = self._get_additional_context()
if additionals:
setattr(context[self.obj_name], self.context_attname, additionals)
return context
class ItemA(Common):
obj_name = 'itema_obj'
types_name = 'additional_itema_types'
context_attrname = 'itema'
t1 = 5
class RunC(Common):
obj_name = 'runc_obj'
types_name = 'additional_runc_types'
context_attrname = 'runc'
tr = 6
由于obj_name
和types_name
都是基于context_attrname
和类似的后缀/后缀构建的,因此仍可以进一步考虑,但是我没有足够的上下文(即是否还有其他内容)需要obj_name
作为类属性),以了解它是否不会破坏某些内容。
答案 1 :(得分:0)
您可以在类构造器中将属性值作为参数。