当前位置: 首页 > 面试题库 >

在python中动态添加@property

宰父焕
2023-03-14
问题内容

我知道我可以通过执行以下操作来向对象动态添加实例方法:

import types
def my_method(self):
    # logic of method
# ...
# instance is some instance of some class
instance.my_method = types.MethodType(my_method, instance)

稍后我可以打电话给我instance.my_method(),自我将被正确绑定,一切正常。

现在,我的问题是:如何做完全相同的事情来获得用@property装饰新方法的行为?

我猜是这样的:

instance.my_method = types.MethodType(my_method, instance)
instance.my_method = property(instance.my_method)

但是,这样做会instance.my_method返回一个属性对象。


问题答案:

property描述对象需要住 实例中
,有你想要的效果。如果您不想更改现有的类以避免更改其他实例的行为,则需要创建“每个实例的类”,例如:

def addprop(inst, name, method):
  cls = type(inst)
  if not hasattr(cls, '__perinstance'):
    cls = type(cls.__name__, (cls,), {})
    cls.__perinstance = True
    inst.__class__ = cls
  setattr(cls, name, property(method))

我用属性标记这些特殊的“每实例”类,以避免addprop在同一实例上进行多次调用时不必要地进行多个调用。

请注意,就像对的其他用法一样property,您需要游戏中的类是 新样式 (通常是通过直接继承或间接继承来获得object),
而不是 默认情况下分配给不包含以下内容的类的古老的旧样式(Python 3中已删除)基地。



 类似资料:
  • 问题内容: 如何在之前或之后向现有功能添加代码? 例如,我有一堂课: 我该如何编辑类元编程,以便执行此操作 也许有某种方法可以附加另一个功能进行测试? 添加另一个功能,例如 并将原件更改为 有没有办法做到这一点? 问题答案: 如果需要,可以使用装饰器来修改功能。但是,由于它不是在函数初始定义时应用的装饰器,因此您将无法使用语法糖来应用它。 请注意,它也会修改现有实例的方法。 编辑 :使用和将装饰器

  • 问题内容: 如何在jpanel中动态添加组件?当我单击按钮时,我应该有添加按钮,组件应该添加到JPanel。 我的问题是,当我单击添加按钮时,将文本字段和按钮添加到jpanel时,用户可以根据需要将它们添加到jpanel中的任意次数单击添加按钮。我已将scrollerpane添加到我的jpanel,并且jpanel布局管理器设置为null。 问题答案: 像往常一样,除了必须调用: 完成后,因为容器

  • 问题内容: 在我的应用程序中,组件必须动态更改。我有一个数据表,其中我有两列,首先是菜单中的a我有两个数据(数据分别为1和2),如果选择了1,则应出现a,如果选择了2,则应出现。需要帮助吗? 我的JSF 我的豆类 问题答案: 我的建议是:不要动态添加/删除组件。用另一种方法解决您的问题: 切换组件的 可见性 重新绑定属于组件的 数据 动态添加/删除组件始终是麻烦的源头,而且您有可能以另一种简单得多

  • 我正在尝试构建一个在JavaFX中实现群聊的聊天应用程序。我想在边框窗格内创建一个滚动窗格,该窗格将包含用户所属的所有组。当用户加入时,需要将组图标(ImageViews)动态添加(在场景生成器中无法完成)到滚动窗格(在HBox内)。 目前,我正在使用一个SceneController类,该类负责所有阶段和场景更改。 我已经创建了一个FXML文件(使用场景生成器),其中包含一个边框窗格和一个滚动窗

  • 我目前正在开发一个图像编辑器应用程序。我试图在我的应用程序中提供一个选项来处理不同的层,比如GIMP或Photoshop。我的方法是为用户添加的每个层添加一个。一切都很好,但不知怎么的,我动态添加的画布没有出现。 在我的类构造函数中,我添加了1个通用画布,它包含一个背景图像,不能编辑。这个画布(它是全球性的)确实显示出来并正常工作。所有可以编辑的层都存储在

  • 编辑 删除这一行后,将在控制台上打印日志。但是,我看不到正在创建的文件。