有很多方法可以做到:类装饰器,元类和Mixin。
常用助手功能:
def set_pyqtproperties(klass, properties, proxy='user'): def make_prop(prop): def property_(self): return getattr(getattr(self, proxy), 'get_' + prop) property_.__name__ = prop return property_ if isinstance(properties, basestring): properties = properties.split() for prop in properties: setattr(klass, prop, pyqtProperty(QVariant, make_prop(prop)))
类装饰器
def set_properties(properties): def decorator(klass): set_pyqtproperties(klass, properties) return klass return decorator
用法
@set_properties("display background")class LightDMUser(QObject): pass如果不支持类装饰器,则可以尝试:
class LightDMUser(QObject): passLightDMUser = set_properties("display background")(LightDMUser)元类
def set_properties_meta(properties): def meta(name, bases, attrs): cls = type(name, bases, attrs) set_pyqtproperties(cls, properties) return cls return meta
用法
class LightDMUser(QObject): __metaclass__ = set_properties_meta("display background")注意:如果将属性列表设置为类属性,则可以重用同一元类:
def metaClass(name, bases, attrs): cls = type(name, bases, attrs) set_pyqtproperties(cls, attrs.get('properties', '')) return clsclass LightDMUser(QObject): properties = "display background" __metaclass__ = metaClass另外,您可以
attrs直接
attrs[name] = value进行操作:在调用之前
type()代替
setattr(cls, name,value)。
以上假设
QObject.__class__ is type。
混合蛋白
def properties_mixin(classname, properties): #note: create a new class by whatever means necessary # e.g., even using exec() as namedtuple does # http://hg.python.org/cpython/file/3.2/Lib/collections.py#l235 # reuse class decorator here return set_properties(properties)(type(classname, (), {}))用法
PropertiesMixin = properties_mixin('PropertiesMixin', 'display background')class LightDMUser(PropertiesMixin, QObject): pass我还没有尝试过。这里的代码显示了实现该功能可能需要的数量和代码种类。



