gpt4 book ai didi

python - 有条件地定义属性(使用装饰器)(例如 try/except?)

转载 作者:行者123 更新时间:2023-12-01 01:29:38 25 4
gpt4 key购买 nike

我正在寻找一种在 python 中有条件地定义属性的方法。这个想法是在 try/except block 内定义属性

class PyObject(SomeOtherObj):

def __init__(self, dbaObj):

super(SomeOtherObj, self).__init__()

self._CreateAttributes()

def _CreateAttributes(self):

try:
self.GetProperty("MyProperty") #This method comes from the parent
except:
pass
else:
@property
def MyProperty(self):
return self.GetProperty("MyProperty")

@MyProperty.setter
def MyProperty(self, value):
return self.ModifyProperty("MyProperty", value) #This method comes from the parent

我不知道父对象内部定义了哪些属性,因此我需要有条件地构建属性的东西。也欢迎任何其他解决方案。

[编辑] 另一种尝试...然而,不仅属性被创建,而且尝试访问它会引发无限递归错误

class PyObject(SomeOtherObj):

def __init__(self, dbaObj):

super(SomeOtherObj, self).__init__()

@property
def MyProperty(self):
try:
return self.GetProperty("MyProperty")
except:
del self.MyProperty

@MyProperty.setter
def MyProperty(self, value):
return self.ModifyProperty("MyProperty", value) #This method comes from the parent

@MyProperty.deleter
def MyProperty(self):
self.__delattr__(self.MyProperty)

[EDIT2] 我在父级中有一个方法,可以让我知道哪些属性。为了举例说明,我们假设我在 SomeOtherObj C++ 类中有一个方法 ListAttributes,它返回由父类动态创建的属性名称(字符串)列表。

最佳答案

您可以将 python 类视为具有特殊绑定(bind)的代码命名空间。您可以在类主体中编写几乎任何内容(想想一个循环,为了额外的疯狂),它将在类导入时执行(实际上是在模块导入中)。您遇到的唯一问题是您无法轻松访问子类闭包中的父类(不使用元类)。

因此,如果您需要制作快速而肮脏的补丁,您实际上可以制作try/except,如下所示:

class Child(Parent):
try:
Parent.get_property
@property
def my_property(self):
return self.get_property()

@my_property.setter
def my_property(self, value):
self.set_property(value)
except:
pass

第一个问题——父类是硬编码的,如果你改变继承,你需要改变实现。这实际上是一个糟糕的设计,但如果你几乎不受约束,也许这对你来说没问题。

更大的问题是,这样的界面很难使用。在大多数情况下,如果您提供属性/方法,您的用户将期望类具有此属性/方法。仅仅因为某些父类缺少方法而不断使用 if/elsetry/except 并不有趣。这部分无法按照您现在的方式修复。

那么,要考虑的主要事情是——当父类行为未知时,情况会怎样?如果用户在安装时已知,请考虑提供两个不同的子类,内部不会有任何意外。

如果它仅在运行时已知,为什么还要费心检查呢?用户仍会使用

try:
child_obj.my_property
except AttributeError:
...

捕捉你的flappy界面,但有趣的是缺少父getter会产生相同的异常,所以很简单

class Child(Parent):
@property
def my_property(self):
return self.get_property()

@my_property.setter
def my_property(self, value):
self.set_property(value)

使用方式几乎相同

关于python - 有条件地定义属性(使用装饰器)(例如 try/except?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53004487/

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