我对一些代码运行pylint的,并收到错误“太少公共方法(0/2)”。 这是什么意思的消息? 该pylint的文档也没有什么帮助:
使用时类有太少的公共方法,所以可以肯定的,它是值得的。
我对一些代码运行pylint的,并收到错误“太少公共方法(0/2)”。 这是什么意思的消息? 该pylint的文档也没有什么帮助:
使用时类有太少的公共方法,所以可以肯定的,它是值得的。
错误基本上是说类并不意味着只是存储数据,因为你基本上是治疗类作为字典。 类至少应该有一些方法来对他们持有的数据进行操作。
如果您的类看起来是这样的:
class MyClass(object):
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
考虑使用一本词典或是namedtuple
代替。 但如果一个类似乎是最好的选择,使用它。 pylint的并不总是知道什么是最好的。
请注意, namedtuple
是不可改变的,分配上实例化值不能在以后修改。
如果要扩展一个类,那么我的建议是系统地禁用此警告,继续前进,例如,在芹菜任务的情况下:
class MyTask(celery.Task): # pylint: disable=too-few-public-methods
"""base for My Celery tasks with common behaviors; extends celery.Task
...
即使你只延伸的单一功能,你肯定需要一个类,使这项技术的功能和扩展是绝对比黑客对第三方类的更好!
这是另一种情况pylint
的盲目规则。
“类并不意味着存储数据” - 这是一个伪命题。 词典是不好的一切。 一类的数据成员是有意义的事,一本字典项是什么可选的。 证明:你可以做dictionary.get('key', DEFAULT_VALUE)
以防止KeyError
,但没有简单__getattr__
默认。
我需要更新我的答案。 现在-如果你需要一个struct
,你有两大选择:
attrs
这是该库:
https://www.attrs.org/en/stable/
import attr
@attr.s
class MyClass(object): # or just MyClass: for Python 3
foo = attr.ib()
bar = attr.ib()
你会得到什么额外的:不写构造函数,默认值,验证, __repr__
,只读对象(更换namedtuples
,甚至在Python 2)等。
dataclasses
(PY 3.7+) 继hwjp的评论,我还建议dataclasses
:
https://docs.python.org/3/library/dataclasses.html
这是几乎一样好attrs
,并且是一个标准库机制(“内含电池”),没有额外的依赖,除了Python的3.7+。
NamedTuple
不是很大-尤其是前巨蟒-3的typing.NamedTuple
: https://docs.python.org/3/library/typing.html#typing.NamedTuple -你一定要检查出“从派生类NamedTuple
模式”。 Python的2 - namedtuples
从字符串描述创造的-是丑陋的,坏的和“字符串文字内编程”愚蠢的。
我同意两个电流答案(“考虑用别的东西,但pylint的并不总是正确的” - 接受的一个,而“使用pylint的抑制意见”),但我有我自己的建议。
让我指出这一点,更多的时间:有些类是为了刚刚来存储数据。
现在的选择也考虑 -使用property
-ies。
class MyClass(object):
def __init__(self, foo, bar):
self._foo = foo
self._bar = bar
@property
def foo(self):
return self._foo
@property
def bar(self):
return self._bar
以上你只读属性,它是值对象确定(例如像那些在领域驱动设计),但你也可以提供制定者 - 这样你的类就能够承担责任,你有领域 - 例如做一些验证等等。(如果你有制定者,你可以指定在构造函数中使用它们,即self.foo = foo
,而不是直接self._foo = foo
,但仔细的制定者可以假设其它字段设置为已初始化,然后你需要在构造函数中定义验证)。
我增加了一个额外的方法上我的课
def __str__(self):
return self.__class__.__name__
问题解决了