Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 除非类调用提供,否则为属性设置默认值的最干净方法是什么?_Python_Python 3.x - Fatal编程技术网

Python 除非类调用提供,否则为属性设置默认值的最干净方法是什么?

Python 除非类调用提供,否则为属性设置默认值的最干净方法是什么?,python,python-3.x,Python,Python 3.x,目前我正在做的就是: class NewShip: def __init__(self, position = (0,0), x_velocity = 25, y_velocity = 15, anim_frame = 1, frame1 = "space_ship_1.png", frame2 = "space_ship_2.png", angle = 0, border_size = 900): self.position = position sel

目前我正在做的就是:

class NewShip:
    def __init__(self, position = (0,0), x_velocity = 25, y_velocity = 15, anim_frame = 1, frame1 = "space_ship_1.png", frame2 = "space_ship_2.png", angle = 0, border_size = 900):
        self.position = position
        self.angle = angle
        self.x_velocity = x_velocity #in pixels per frame
        self.y_velocity = y_velocity #in pixels per frame
        self.anim_frame = anim_frame
        self.frame1 = pygame.image.load(frame1).convert_alpha()
        self.frame2 = pygame.image.load(frame2).convert_alpha()
        self.frame1 = pygame.transform.scale(self.frame1, (128,128))
        self.frame2 = pygame.transform.scale(self.frame2, (128,128))
        self.position = DummyObject()
        self.position.x = position[0]
        self.position.y = position[1]
        self.border_size = border_size
但老实说,这是相当乏味的,并使添加更多的兼性属性成为一个真正的痛苦

我是否应该跳过整个“让人们用关键字参数声明属性”的过程,在更改对象的任何属性之前,以完全默认的状态实例化对象

编辑: 显然,这是完美的:

class NewShip:
    def __init__(self, **kwargs):
        self.angle = 0
        self.x_velocity = 25 #in pixels per frame
        self.y_velocity = 15 #in pixels per frame
        self.anim_frame = 1
        frame1 = "space_ship_1.png"
        frame2 = "space_ship_2.png"
        self.position = DummyObject()
        self.position.x = 0
        self.position.y = 0
        self.border_size = 900
        for element in kwargs: setattr(self, element, kwargs[element])
        self.frame1 = pygame.image.load(frame1).convert_alpha()
        self.frame2 = pygame.image.load(frame2).convert_alpha()
        self.frame1 = pygame.transform.scale(self.frame1, (128,128))
        self.frame2 = pygame.transform.scale(self.frame2, (128,128))
也就是说,只需设置所有默认值,然后使用关键字args覆盖它们,在kwargs:setattr(self,element,kwargs[element])


让我知道是否有更干净的方法,尽管我不得不说我对此更满意。

为了减少混乱,您可以选择定义默认字典属性
\u init\u attrs
,例如,使用
**kwargs
定义函数,然后使用循环在
self
上定义
setattr
,使用
\u init\u attrs[k]
作为
kwargs.get的
默认值,当未提供任何参数时:

class NewShip:
    def __init__(self, **kwargs):
        _init_attrs = {'angle': 0,
             'anim_frame': 1,
             'border_size': 900,
             'frame1': 'space_ship_1.png',
             'frame2': 'space_ship_2.png',
             'position': (0, 0),
             'x_velocity': 25,
             'y_velocity': 15 }

        for k, v in _init_attrs.items():
            setattr(self, k, kwargs.get(k, v)

这使得
\uuuuu init\uuuuuuuuuu>更神秘,但实现了在缩小尺寸的同时使其更具可扩展性的目标。

根据我的编辑,我无意中首先设置了默认值,然后使用for循环用kwargs覆盖默认值,尽管我不得不说,使用dict并使用kwargs更新它的解决方案更加优雅和干净。非常感谢你!此外,您也不希望只在
kwargs
中迭代任何内容并调用
setattr
,因为它本质上允许您覆盖不希望被覆盖的内容。考虑在<代码> > iNITHARTS/<代码>(不更新它)上迭代,并使用<代码> KWARG.GET(key,yInItAtths[Key)]
。我喜欢poke的想法,但使用
.pop
可能会更好,这样,如果
kwargs
中有任何条目,则可以在传递不受支持的参数时引发相应的错误。@poke我不确定您的意思。如果有什么我不想重写的,我就不能把它放在_init_attrs中,然后在遍历kwargs之后简单地赋值,可以吗?非常感谢您的帮助!