有没有装饰类属性的首选方法?如我所见,您可以用另一个属性来装饰属性本身,也可以装饰基础方法,然后@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) 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)