动态添加属性和setter的Pythonic方法

2024-04-19 21:56:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一个3D应用程序开发一个库,它将应用程序的功能包装成一组Python类,并添加应用程序没有的附加功能。

我在基类中有一组属性,可以使用现有的API向节点添加属性,但我希望有一种更优雅的动态添加属性的方法。我现在有这段代码(如果不熟悉3D应用程序,这可能就没有什么意义),但重要的一点是

# Add block properties

以及

# PROPERTIES

代码。

class Block(pyunify.Transform):
    def __init__(self, name = "Character"):
        pyunify.Transform.__init__(self, name)
        self.LockTransform()


class Spine(Block):
    def __init__(self, name = "Character", numberOfJoints=6):
        Block.__init__(self, name+"_spine")

        # Add block properties
        self.AddAttr("numberOfJoints", "long")
        self.SetAttr("numberOfJoints", numberOfJoints)

        # Create block template
        self.Template()

    # PROPERTIES
    @property
    def numberOfJoints(self):
        return self.GetAttr("numberOfJoints")

    @numberOfJoints.setter
    def numberOfJoints(self, num):
        self.SetAttr("numberOfJoints", num)

所以我可以预见额外的类有更多的属性,我现在拥有它的方式,对于每一个属性,我都必须在in it中添加它

self.AddAttr("numberOfJoints", "long")
self.SetAttr("numberOfJoints", numberOfJoints)

然后我必须在我的类中添加2个额外的函数,一个getter和setter,以便我可以在类中调用它作为self.numberOfJoints,它将与类本身交互,并在3D应用程序中的相应节点上设置正确的属性。

    @property
    def numberOfJoints(self):
        return self.GetAttr("numberOfJoints")

    @numberOfJoints.setter
    def numberOfJoints(self, num):
        self.SetAttr("numberOfJoints", num)

与其他属性函数的唯一区别是名称,所以我想知道是否有一种方法可以在我的基块类中创建AddProperty函数,这样我就可以在我的初始化函数中这样做:

self.AddProperty("numberOfJoints", "long")
self.numberOfJoints = 5

除了运行

self.AddAttr("numberOfJoints", "long")

任何帮助都将不胜感激!

谢谢!


Tags: 函数nameself应用程序属性initdefblock
1条回答
网友
1楼 · 发布于 2024-04-19 21:56:38

如果要执行类似于属性访问的操作,但在“执行函数”下,则需要descriptor。描述符是一个看起来像属性的对象,但是它会拦截get和set调用,并允许您运行所需的任何代码。下面是一个stackoverflow问题,其中有一个使用描述符更改对象翻译的示例:

https://stackoverflow.com/a/22292961/1936075

您可以使用相同的技巧以更可读、更少命令的方式创建、获取和设置自定义属性。

更多代码here

相关问题 更多 >