分组到具有相似功能但属性名称不同的类

时间:2018-07-12 12:00:42

标签: python python-3.x

我有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

2 个答案:

答案 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_nametypes_name都是基于context_attrname和类似的后缀/后缀构建的,因此仍可以进一步考虑,但是我没有足够的上下文(即是否还有其他内容)需要obj_name作为类属性),以了解它是否不会破坏某些内容。

答案 1 :(得分:0)

您可以在类构造器中将属性值作为参数。