gpt4 book ai didi

python - 如何获取当前类对象的引用?

转载 作者:太空狗 更新时间:2023-10-30 02:05:57 24 4
gpt4 key购买 nike

在 Python 中,如何在类语句中获取对当前类对象的引用?示例:

def setup_class_members(cls, prefix):    setattr(cls, prefix+"_var1", "hello")    setattr(cls, prefix+"_var2", "goodbye")class myclass(object):    setup_class_members(cls, "coffee")  # How to get "cls"?    def mytest(self):        print(self.coffee_var1)        print(self.coffee_var2)x = myclass()x.mytest()>>> hello>>> goodbye


我已经注销的替代方案是:

  1. 使用 locals():这会在类语句中给出一个可以写入的字典。这似乎适用于类(class),但是文档告诉您不要这样做。 (如果有人可以向我保证这将继续工作一段时间,我可能会想采用这种替代方法。)

  2. class语句后给类对象添加成员:我的实际应用是派生一个PyQt4QWidget类,动态创建pyqtProperty类属性。 QWidget 的不寻常之处在于它有一个自定义的元类。非常粗略地说,元类编译了一个 pyqtProperties 列表并将其存储为附加成员。因此,创建后添加到类中的属性无效。清除此问题的示例:

from PyQt4 import QtCore, QtGui# worksclass MyWidget1(QtGui.QWidget):    myproperty = QtCore.pyqtProperty(int)# doesn't work because QWidget's metaclass doesn't get to "compile" mypropertyclass MyWidget2(QtGui.QWidget):    passMyWidget2.myproperty = QtCore.pyqtProperty(int)

请注意,以上内容适用于大多数编程情况;我的案例恰好是那些不寻常的极端案例之一。

最佳答案

对于 Python 3,类必须声明为

class myclass(object, metaclass = Meta):
prefix = "coffee"
...


其他几点:

  • 元类可以是可调用的,而不仅仅是一个类(Python 2&3)

  • 如果您的类的基类已经有一个非标准的元类,您必须确保调用它是 __init__()__new__()方法而不是类型。

  • class 语句接受传递给元类的关键字参数(仅限 Python 3)

使用上述所有方法在 Python 3 中重写 mouad 的解决方案是...

def MetaFun(name, bases, attr, prefix=None):
if prefix:
attr[prefix+"_var1"] = "hello"
attr[prefix+"_var2"] = "goodbye"

return object.__class__(name, bases, attr)

class myclass(object, metaclass = MetaFun, prefix="coffee"):
def mytest(self):
print(self.coffee_var1)
print(self.coffee_var2)

关于python - 如何获取当前类对象的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7260370/

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