我看到像这样的模式
def __init__(self, x, y, z):
...
self.x = x
self.y = y
self.z = z
...
Run Code Online (Sandbox Code Playgroud)
经常使用更多参数.有没有一种好方法可以避免这种乏味的重复性?该类应该继承namedtuple吗?
为了交互式地测试我的python脚本,我想创建一个Namespace对象,类似于返回的对象argparse.parse_args().显而易见的方式,
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.parse_args()
Namespace()
>>> parser.parse_args("-a")
usage: [-h]
: error: unrecognized arguments: - a
Process Python exited abnormally with code 2
Run Code Online (Sandbox Code Playgroud)
可能导致Python repl退出(如上所述)一个愚蠢的错误.
那么,使用给定属性集创建Python命名空间的最简单方法是什么?
例如,我可以动态创建dict(dict([("a",1),("b","c")]))但我不能将其用作Namespace:
AttributeError: 'dict' object has no attribute 'a'
Run Code Online (Sandbox Code Playgroud) 在Python中,假设我有一些继承自Shape的类Circle.形状需要x坐标和y坐标,此外,圆需要半径.我希望能够通过做类似的事情来初始化Circle,
c = Circle(x=1., y=5., r=3.)
Run Code Online (Sandbox Code Playgroud)
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']
Run Code Online (Sandbox Code Playgroud)
或者,我可以自动使用我的圆圈属性 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)
Run Code Online (Sandbox Code Playgroud)
这样做的好处是代码更少,我不需要维护样板self.foo = kwargs['foo'].缺点是Circle不需要哪些参数.这被认为是作弊还是这种好风格(只要Circle的界面有详细记录)?
谢谢大家,感谢您的深思熟虑.在self.__dict__.update(**kwargs)我试验组织我的代码时,hack对我很有用,但我会确保通过明确地正确传递参数并在生产代码中进行明确的错误检查来替换它.
python ×3
argparse ×1
dictionary ×1
namedtuple ×1
namespaces ×1
oop ×1
python-2.7 ×1
python-attrs ×1