python - self.__dict__.update(**kwargs) 的风格是好是坏?

标签 python oop dictionary

在Python中,假设我有一些继承自Shape的类Circle。 Shape 需要 x 和 y 坐标,此外,Circle 需要半径。我希望能够通过执行类似的操作来初始化 Circle,

c = Circle(x=1., y=5., r=3.)

Circle 继承自 shape,因此我需要使用 __init__ 的命名参数,因为不同的类需要不同的构造函数。我可以手动设置 x、y 和 r。

class Shape(object):
    def __init__(self, **kwargs):
        self.x = kwargs['x']
        self.y = kwargs['y']

class Circle(Shape):
    def __init__(self, **kwargs):
        super(Circle, self).__init__(**kwargs)
        self.r = kwargs['r']

或者,我可以使用 self.__dict__.update(kwargs) 自动设置我的圈子的属性

class Shape(object):
    def __init__(self, **kwargs):
        self.__dict__.update(**kwargs)

class Circle(Shape):
    def __init__(self, **kwargs):
        super(Circle, self).__init__(**kwargs)

这样做的好处是代码更少,而且我不需要维护像self.foo = kwargs['foo']这样的样板文件。 。缺点是 Circle 需要哪些参数并不明显。这被认为是作弊还是这种风格很好(只要 Circle 的接口(interface)有详细的文档记录)?

<小时/>

谢谢大家的周到回复。 self.__dict__.update(**kwargs) hack 对我尝试组织代码很有用,但我会确保用正确显式传递参数并在生产代码中进行清晰的错误检查来替换它。

最佳答案

class Shape(object):
    def __init__(self, x=None, y=None):
        self.x = x
        self.y = y

class Circle(Shape):
    def __init__(self, r=None, **kwargs):
        super(Circle, self).__init__(**kwargs)
        self.r = r

就是这样。当您并不真正需要时,请勿使用 **kwargs

Is this considered a cheat or is this good style (as long as the interface to Circle is well-documented)?

当你在编写简单、易懂的代码和令人头疼的代码 + 漂亮的文档字符串之间做出选择时,你实际上没有任何选择,你只需去编写简单的、自文档化的代码:)

关于python - self.__dict__.update(**kwargs) 的风格是好是坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57082774/

相关文章:

iphone - 将 NSString 转换为日期错误

python - 使用应用服务计划函数应用程序的自定义 python 包发布 Azure 函数

python - 两个分类变量的描述性统计( Pandas )

javascript - 有什么理由在构造函数中手动设置 `return` 吗?

python - 修改字典中的嵌套值

python - 即使顺序不同,如何检查字符串中的单词 - PYTHON

dictionary - 如何在 Go 中获取变量的内存大小?

python - 通过innerHTML使用Python和Selenium定位元素

java - 解释一下派生接口(interface)是什么意思?

python - 在 python 中从类调用函数 - 不同的方式