在python中创建类的常规方法不允许在类名中使用空格。
>>> class Foo Bar(object):
SyntaxError: invalid syntax
但是,使用内置的type()函数,我们可以使用以下名称创建带有空格的类:
>>> C = type('Foo Bar', (object,),{})
>>> C
<class '__main__.Foo Bar'>
是否存在任何风险,或者使用带有空格的类名被认为是不好的做法?
答案 0 :(得分:4)
没有风险,类__name__
是可写的属性,它没有用于任何特别重要的事情-只是无聊的东西,例如repr和帮助显示。
如果您尝试为其分配非字符串,则会出现一条自定义错误消息,这是有力的证据表明Python开发人员有机会在此处限制有效标识符,并且他们有意选择不这样做:
>>> class A:
... pass
...
>>> A.__name__ = '123Class'
>>> A.__name__ = 123
TypeError: can only assign string to 123Class.__name__, not 'int'
Guido在这里回答类似的问题-有关是否应将属性名称限制为有效标识符:
https://mail.python.org/pipermail/python-dev/2012-March/117441.html
我已经就这个特定问题说了几个 之前的时间功能,您可以使用任意字符串
getattr()
和setattr()
。但是,这些功能应该(并且可以!) 拒绝非字符串。
相同的理由适用于类名(也可以作为任意字符串存储在模块名称空间中)。此功能的一个用例示例:即使外部数据与Python保留字或语法冲突,也要确保一系列类名与某些外部数据源之间存在一致的映射。
答案 1 :(得分:1)
是否存在任何风险,或者使用带有空格的类名被认为是不好的做法?
由于PEP8建议为类名使用CapWords样式,因此绝对认为这是不好的做法。您将遇到的唯一技术难题是不能使用常规语法来实例化这样一个以空格命名的类:
x = Foo Bar() # SyntaxError
但是实际的问题始终是它非常不寻常,任何人阅读您的代码或调试您的bug都会很困难。如果我想象看到类似AttributeError: 'Foo Bar' object has no attribute 'x'
之类的东西,我首先会尝试找出类名出了什么问题,因为根本没有人在其中包含空格。
所以请不要。