为了账号安全,请及时绑定邮箱和手机立即绑定

您如何解包方法参数以为其分配类属性?

您如何解包方法参数以为其分配类属性?

Qyouu 2021-06-10 18:17:15
我经常做这样的事情:class Box:    def __init__(self):        some_setup_stuff()    def configure(        self,        color               = "#ffffff",        weight              = 1,        empathy             = 97,        angle_x             = 0,        angle_y             = 0,        angle_z             = 0,        displacement_x      = 0,        displacement_y      = 0,        displacement_z      = 0        ):        self.color          = color        self.weight         = weight        self.empathy        = empathy        self.angle_x        = angle_x        self.angle_y        = angle_y        self.angle_z        = angle_z        self.displacement_x = displacement_x        self.displacement_y = displacement_y        self.displacement_z = displacement_z    def open(self):        reveal_head()是否有一些简洁、小巧、相当合理的方法可以将传递给类方法的参数“解包”到类的属性中(同时保持明确指定的默认值)?就像,我在想也许locals()可以在方法的第一行周围以某种方式使用,但对我来说并不明显。所以我们最终可能会得到这样的结果:class Box:    def __init__(self):        some_setup_stuff()    def configure(        self,        color               = "#ffffff",        weight              = 1,        empathy             = 97,        angle_x             = 0,        angle_y             = 0,        angle_z             = 0,        displacement_x      = 0,        displacement_y      = 0,        displacement_z      = 0        ):        # magic possibly involving locals()    def open(self):        reveal_head()它可以像这样使用:>>> box = Box()>>> box.configure(empathy = 98)>>> box.weight1>>> box.empathy98
查看完整描述

1 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

这是一个有点hacky的方法。构建一个defaults包含允许参数默认值的字典。然后更新self.__dict__与**kwargs,在按键上的一些错误检查后:


class Box:

    def __init(self):

        pass

    def configure(self, **kwargs):

        defaults = {

            "color": "#ffffff",

            "weight": 1,

            "empathy": 97,

            "angle_x": 0,

            "angle_y": 0,

            "angle_z": 0,

            "displacement_x": 0,

            "displacement_y": 0,

            "displacement_z": 0

        }

        bad_args = [k for k in kwargs if k not in defaults]

        if bad_args:

            raise TypeError("configure() got unexpected keyword arguments %s"%bad_args)

        self.__dict__.update(defaults)

        self.__dict__.update(kwargs)

现在你可以这样做:


box = Box()

box.configure(empathy = 98)

print(box.weight)

#1

print(box.empathy)

#98

但如果你这样做了:


box.configure(wieght = 2)

#TypeError: configure() got unexpected keyword arguments ['wieght']


查看完整回答
反对 回复 2021-06-22
  • 1 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信