相关疑难解决方法(0)

装饰属性:正确的顺序

有没有装饰类属性的首选方法?如我所见,您可以用另一个属性来装饰属性本身,也可以装饰基础方法,然后@property在其上应用。
两种方法都需要考虑吗?

def decorate_property(prop):
    @property
    def inner(instance):
        return prop.__get__(instance) + 1
    return inner

def decorate_func(func):
    def inner(instance):
        return func(instance) +1
    return inner

class A:

    x = 1

    @decorate_property
    @property
    def f(self):
        return self.x

    @property
    @decorate_func
    def g(self):
        return self.x

a = A()
print(a.f) # 2
print(a.g) # 2
Run Code Online (Sandbox Code Playgroud)

python

5
推荐指数
1
解决办法
55
查看次数

Pylint警告`W0212`,其属性访问受保护成员:如何避免?

Pylint警告可疑访问对象的受保护成员.它知道当访问来自对象时如何不警告,但是当访问来自对象的属性时,不知道如何不警告.

防爆.

class C(object):

    def __init__(self):
        C.__a = 0

    a = property(lambda self: self.__a)
Run Code Online (Sandbox Code Playgroud)

Pylint告诉" W0212(protected-access):访问__a客户端类的受保护成员"

我不想全局禁用W0212,我不满意在本地(*)为每个这样的属性定义重复禁用它.

有没有一种已知的解决方法?

(*)如:

class C(object):

    def __init__(self):
        C.__a = 0

    a = property(lambda self: self.__a)  # pylint: disable=W0212
Run Code Online (Sandbox Code Playgroud)

保证金说明

作为一个有趣的旁注,我选择的答案提供了实际Pylint的额外好处(可能在未来的版本中有所改变,我无法分辨):它保留了Pylint检查不存在的成员的能力,因为此测试显示:

class C1(object):

    member = 0


class C2(object):

    def __init__(self):
        self.__a = C1()

    def a(self):
        return self.__a

    @property
    def b(self):
        return self.__a

    c = property(lambda self: self.__a)


def test_member():

    o = C2()

    print(o.a().member)
    print(o.b.member)
    print(o.c.member)


def test_nonexistent():

    o = C2() …
Run Code Online (Sandbox Code Playgroud)

python pylint

2
推荐指数
1
解决办法
3408
查看次数

标签 统计

python ×2

pylint ×1