【问题标题】:Pylint: Using property decorator's member function results in "no-member" errorPylint:使用属性装饰器的成员函数会导致“无成员”错误
【发布时间】:2018-09-25 16:30:33
【问题描述】:

我在使用 Pylint 时遇到了以下问题:

给出以下最小示例:

#tpack/__init__.py
class C:
    @property
    def ans(self):
        return 42

def f(c):
    return C.ans.fget(c)

Pylint 产生以下错误:

>pylint -d missing-docstring -d invalid-name -d too-few-public-methods tpack
************* Module tpack
tpack\__init__.py:7:11: E1101: Method 'ans' has no 'fget' member (no-member)

------------------------------------------------------------------
Your code has been rated at 0.00/10 (previous run: 0.00/10, +0.00)

Pylint 版本:

>pylint --version
pylint 2.1.1
astroid 2.0.4
Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)]

这是 Pylint 的已知问题吗?

编辑:

这段代码的使用似乎有些混乱。

这是一个例子:

>python
Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from tpack import *
>>> c = C()
>>> f(c)
42

通过类访问属性时,会获取装饰器生成的实际属性对象。通过这个可以访问属性对象的成员函数。 fgets 是吸气剂。只需将C 类型的对象传递给它,然后返回该属性。

【问题讨论】:

  • 我不这么认为。属性在类上下文中没有意义,只有在实例上下文中才有意义。
  • 如果我没记错的话,你必须为属性设置 getter 和 setter,但我可能错了
  • @E.Serra 他的属性定义很好,在这种情况下,装饰器将属性一个标准的 getter。问题是他试图在类的上下文中使用一个属性,这是没有意义的。这是因为属性接收 self 作为参数,并且没有为 C 类本身设置 self,仅针对 C 的实例。
  • 好点没注意到他在给班级打电话
  • 请在问题的编辑部分和@Mono 的答案中参考此代码的示例用法。

标签: python pylint


【解决方案1】:

好吧,所有的 cmets 和答案确实有意义,因为实例方法应该只在对象上调用,而不是在类上调用。但是,这里因为方法 'ans' 使用了 @property 装饰器,所以在类上调用 'ans' 会返回一个属性对象。 所以,做

print(C.ans)

打印

<property object at 0x000001A819E55CC8>

c = C()
print(c.ans)

打印

42

所以你的代码是正确的。理想情况下可能不是 Pythonic。但是,我已经测试了你的代码,它运行得很好。

所以,是的,这可能是 Pylint 的问题。我对 Pylint 没有太多的见解。所以帮不了你:(

【讨论】:

    【解决方案2】:

    恐怕 Pylint 就在这里,但消息有点误导。

    所以你的C 类有一个名为ans 的属性,ans 定义接收self 作为参数;稍后您使用C.ans 调用C 类本身,但在该类的上下文中,Python 应该将什么作为self 参数传递给ans

    所以问题是self 没有在类的上下文中设置,所以你只能从C 的实例访问属性,而不是从C 类本身。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-14
      • 2013-06-27
      • 2011-08-22
      • 1970-01-01
      • 2014-01-19
      • 2013-01-25
      • 1970-01-01
      • 2018-12-01
      相关资源
      最近更新 更多