gpt4 book ai didi

python - 滥用 'property' 保留字

转载 作者:太空狗 更新时间:2023-10-30 00:54:32 29 4
gpt4 key购买 nike

所以我有一些使用保留字 property 的遗留代码,嗯,错了。在继承的基类中,它们基本上已实现。

class TestClass(object):

def __init__(self, property):
self._property = property

@property
def property(self):
return self._property


test = TestClass('test property')
print(test.property)

运行没有错误。如果你在下面添加另一个方法,你会得到,

class TestClass2(object):

def __init__(self, property):
self._property = property

@property
def property(self):
return self._property

@property
def other_property(self):
return 'test other property'


test = TestClass2('test property')
print(test.property)
print(test.other_property)

抛出:

---> 10     @property
11 def other_property(self):
12 print('test other property')

TypeError: 'property' object is not callable

因为您知道您已经覆盖了本地命名空间中的 property

class TestClass3(object):

def __init__(self, property):
self._property = property

@property
def other_property(self):
return 'test other property'

@property
def property(self):
return self._property


test = TestClass3('test property')
print(test.property)
print(test.other_property)

如果您始终在类的底部定义您的属性 覆盖,您就可以解决这个问题。如果 property 方法只在基类上定义,那么你从中继承的东西也可以解决,因为命名空间。

class TestClass4(TestClass):

def __init__(self, property):
super(TestClass4, self).__init__(property)

@property
def other_property(self):
return 'test other property'


test = TestClass4('test property')
print(test.property)
print(test.other_property)

我义愤填膺地说我们必须在大量遗留代码中更新这个变量名,因为 GAAAAH,但除了必须记住在 property 定义之上添加新方法之外很少修改基类,这实际上不会破坏任何东西吗?

最佳答案

不要隐藏内置函数... 几乎无需重构,您就可以避免完全隐藏内置函数

使用 __getattr__ 而不是 @property 来返回你的 _property 成员......

class TestClass(object):
def __init__(self):
self._property = 12

def __getattr__(self,item):
if item == "property":
#do your original getter code for `property` here ...
# now you have not overwritten the property keyword at all
return getattr(self,"_property") # just return the variable
class TestClass2(TestClass):
def __init__(self):
self._property = 67

print TestClass2().property

class MySubClass(TestClass):
@property
def a_property(self):
return 5

print MySubClass().property
print MySubClass().a_property

真的,顺便说一句,恕我直言,在 python 中使用 @property 没有任何充分的理由。它所做的只是在以后让其他程序员感到困惑,并掩盖了你实际上是在调用一个函数的事实。我以前经常这样做……我现在避免这样做,除非我有非常非常令人信服的理由不这样做

关于python - 滥用 'property' 保留字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37314441/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com