当前位置: 首页 > 面试题库 >

self .__ dict __。update(** kwargs)的风格是好还是不好?

白学
2023-03-14
问题内容

在Python中,假设我有一些从Shape继承的类Circle。形状需要x和y坐标,此外,圆需要半径。我希望能够通过执行以下操作来初始化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的界面有据可查)?

谢谢大家的周到答复。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当您真的不需要它们时,请不要使用。

这被认为是作弊还是良好的风格(只要Circle的界面有据可查)?

当您在编写简单的,易于理解的代码和头痛的代码+漂亮的文档字符串之间做出选择时,您实际上没有任何选择,您只需编写简单的,自我记录的代码即可:)



 类似资料:
  • 问题内容: 内置函数在我看来更像Pythonic,但我发现使用起来更频繁。 Python文档指出它们是等效的。 一位博客作者声称这比。 我应该使用哪个? 问题答案: 我会用。 来自:https : //wiki.python.org/moin/DubiousPython#Premature_Optimization 尽管正确应用优化确实可以加快代码的速度,但很少使用[..]的优化代码会使代码更难阅

  • Clang接受以下代码,但gcc拒绝它。 以下是错误消息:

  • Updates Yarn to the latest version. yarn self-update Note: self-update is not available. See policies for enforcing versions within a project

  • 问题内容: 我正在开发一个显示图像并播放数据库声音的应用程序。我正在尝试确定是否使用单独的JFrame从GUI向数据库添加图像。 我只是想知道使用多个JFrame窗口是否是一种好习惯? 问题答案: 我只是想知道使用多个JFrames是否是一种好习惯? 坏习惯(坏习惯)。 用户不友好:用户只希望看到一个图标时,会在任务栏中看到多个图标。加上编码问题的副作用。 * 编写和维护代码的噩梦: * 一个模态

  • 直译更好还是意译更好?这也是困扰许多译者的一大问题。不但资深译者时常为此犯难,就是初学者,尚未动笔便发愁直译更好还是意译更好,因此步履维艰的,也到有人在。所以,说清楚直译和意译的问题大有必要。 什么是直译?直译即word-for-word translation,也称作literal translation,意思是“按原有的形式来翻译”。典型的例子是将“I have a pair of shoes

  • 问题内容: 在许多类型的SQL中,您可以通过三种方式在每次插入行时将列隐式设置为NULL。这些是: 也就是说,第一个设置NULL标志(与NOT NULL相反),第二个设置NULL标志为默认值,第三个设置NULL标志并将隐式值设置为NULL。 我听说过在Microsoft SQL中第二种变化并不完全相同,因为您还可以为表或模式自定义NULL标志的默认值。 但是对于MySQL,我不相信有这样的功能。另