python – 压缩pyqtproperties
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 压缩pyqtproperties,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3601字,纯文字阅读大概需要6分钟。
内容图文
![python – 压缩pyqtproperties](/upload/InfoBanner/zyjiaocheng/709/bfa073c48c8c46588db1e34483285ed6.jpg)
我正在用Python编写脚本并遇到一些问题:
class LightDMUser(QObject):
def __init__(self, user):
super(LightDMUser, self).__init__()
self.user = user
@pyqtProperty(QVariant)
def background(self): return self.user.get_background()
@pyqtProperty(QVariant)
def display_name(self): return self.user.get_display_name()
@pyqtProperty(QVariant)
def has_messages(self): return self.user.get_has_messages()
@pyqtProperty(QVariant)
def home_directory(self): return self.user.get_home_directory()
@pyqtProperty(QVariant)
def image(self): return self.user.get_image()
@pyqtProperty(QVariant)
def language(self): return self.user.get_language()
@pyqtProperty(QVariant)
def layout(self): return self.user.get_layout()
@pyqtProperty(QVariant)
def layouts(self): return self.user.get_layouts()
@pyqtProperty(QVariant)
def logged_in(self): return self.user.get_logged_in()
@pyqtProperty(QVariant)
def name(self): return self.user.get_name()
@pyqtProperty(QVariant)
def real_name(self): return self.user.get_real_name()
@pyqtProperty(QVariant)
def session(self): return self.user.get_session()
如您所见,此代码非常多余.我尝试像这样冷凝它:
class LightDMUser(QObject):
attributes = ['background', 'display_name', 'has_messages', 'home_directory', 'image', 'language', 'layout', 'layouts', 'logged_in', 'name', 'real_name', 'session']
def __init__(self, user):
super(LightDMUser, self).__init__()
self.user = user
for attribute in self.attributes:
setattr(self, attribute, pyqtProperty(QVariant, getattr(self.user, 'get_' + attribute)))
但是,PyQt4期望类方法本身存在,而不是实例.将setattr代码移出__init__块也不起作用,因为没有为类定义self,所以我真的不知道该怎么做.
任何人都可以看到一种方法来压缩这段代码吗?
解决方法:
有很多方法可以做到:class decorator,metaclass,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):
pass
LightDMUser = 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 cls
class LightDMUser(QObject):
properties = "display background"
__metaclass__ = MetaClass
你也可以直接操作attrs:在调用type()而不是setattr(cls,name,value)之前,attrs [name] = value.
以上假设QObject .__ class__是类型.
混入
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
我没有尝试过任何一个.代码用于显示实现该功能所需的代码量和类型.
内容总结
以上是互联网集市为您收集整理的python – 压缩pyqtproperties全部内容,希望文章能够帮你解决python – 压缩pyqtproperties所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。