【问题标题】:Pythonic way to dynamically add properties and setters动态添加属性和设置器的 Pythonic 方法
【发布时间】:2015-06-16 17:13:14
【问题描述】:

我正在为 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)

所以我可以预见到有更多属性的其他类,以及我现在拥有它的方式,对于每个属性,我必须在 _init__ 中添加它

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)

与附加属性函数的唯一区别是名称,所以我想知道是否有一种方法可以在我的基 Block 类中创建一个 AddProperty 函数,以便我可以在我的 _init__ 函数中执行此操作:

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

除了运行当前的 _init__ 行之外,它还会动态创建 getter 和 setter 函数

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

任何帮助将不胜感激!

谢谢!

【问题讨论】:

  • 你只是想做self.numberOfJoints = numberOfJoints吗?
  • 我正在尝试执行self.numberOfJoints = numberOfJoints,其中设置属性将运行以下附加功能:self.AddAttr("numberOfJoints", "long"); self.SetAttr("numberOfJoints", self.numberOfJoints) 和其他代码

标签: python class properties maya


【解决方案1】:

如果你想做一些看起来像属性访问,但在执行功能的情况下,你需要一个descriptor。描述符是一个看起来像属性但拦截 get 和 set 调用并让您运行所需的任何代码的对象。这是一个 stackoverflow 问题,其中包含一个使用描述符来更改对象翻译的示例:

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

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

更多代码here.

【讨论】:

    猜你喜欢
    • 2019-06-03
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多