python-元类配置类.但是我们可以配置元类吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-元类配置类.但是我们可以配置元类吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3662字,纯文字阅读大概需要6分钟。
内容图文
我发现元类的存在和使用可以为类创建过程提供优雅的句柄,从而使您免于编写大量代码.我在应用程序中使用了此实例,其中实例化了几个交互服务器.详细说明:
每个设备实例化一个特定于其操作的服务器类,该服务器类是该BaseServer类的子类(…的子类).现在,某些设备服务器需要ThreadedTCPserver,而另一些则需要SimpleTCPServer(模块:socketserver).它们不能全部来自同一个类,因为使用ThreadingMixin会覆盖SimpleTCPServer的行为.
为了处理这种动态类配置,我创建了一个MetaServerType,它选择BaseServer的基类为(SimpleTCPServer)或(ThreadedTCPServer)->.产生我期望的动态配置服务器类的结果! (呜呜)
现在,我的问题来了:
我想使用一个存储参数的配置文件,默认情况下,MetaServerType使用这些参数.例如:config.default_loglevel或config.default_handler等.根据元类规范,可以覆盖各个服务器(从命令行或其他方式).
优良的设计实践是仅通过程序流传递配置对象的一个??实例?一种实现方法是在元类的类主体中初始化config对象-但我的程序流程在其他地方开始,这意味着该元类被多次调用,从而生成各种config实例.似乎在导入时调用了元类(?)
因此,欢迎您提供详细的答案:
>如何为元类提供配置信息?
>使单个配置实例通过程序流,进行编辑,更新以及最终编写的好方法是什么?
>元类的输入参数能否以某种方式扩展到元类之外.__new __(元,名称,基数,属性)?
>奖励问题:这是否使我们向(服务器的)有限状态机迈进了一步,从而可以“暂停”或“恢复”状态(而不是实例)?
解决方法:
1 – How can one supply metaclasses with configuration info?
有两种方法可以执行此操作-因为您的元类位于各自的模块中
(是的,模块在导入时执行一次,而不管它在同一应用程序中导入了多少次),配置它们的一种好方法是拥有一个可调用对象(同一模块上的类或函数) ),则会设置用于配置的“全局变量”.
尽管由于C起源于名称“ global”而声誉不佳,但是Python中的全局变量实际上是“模块”变量:这意味着该模块中的所有函数(包括方法)都可以访问这些变量.其他模块中的功能或代码必须为此添加模块名称前缀.
所以像这样的功能:
def configure_servers(p1, p2,...):
global opt1, opt2, ...
opt1 = p1
opt2 = p2
(...)
在创建服务器实例之前,可以从应用程序入口点调用它. (当然,您可以传递一个配置文件路径来读取而不是p1,p2,…)
2 – What is a good way to have a SINGLE config instance be passed
through the program-flow, to be
edited, updated and perhaps eventually
written?
元类模块上的全局(模块)变量名可以被所有人读取,并且可以与复杂的配置对象相关联.也许像上面那样的“配置”功能的存在会使这个问题过时.
但是,如果您确实需要一个“单例”对象,即一个只有一个实例的对象,则可以通过以下简单方法完成:在元类字典上使用一个类,然后将该类传递给其他对象,而不是它的一个实例.如果您有字典而不是课程,那就更好,更干净.
如果您需要创建“真正的”单例对象,则应使用一个类并覆盖其中的__new__方法,以便它始终返回创建的第一个实例-
例:
class Singleton(object):
_instance = None
def __new__(cls, *args, **kw):
if cls._instance is not None:
return cls._instance
self = object.__new__(cls, *args, **kw)
cls._instance = self
return self
3 – Can the input arguments to metaclass be somehow extended beyond
the Metaclass.new(meta, name, bases, attrs) ?
没有利用语言语法.
我的意思是,始终可以将元类作为普通的Python调用来调用,但这会阻止您使用语言语法来描述您的类:您需要将类主体定义为字典,以作为attrs传入电话.
例如,要创建派生的异常类,可以执行以下操作:
MyException = type("MyException", (Exception, ), {})
代替:
class MyException(Exception):
pass
将附加信息传递给元类的通常方法是在类主体上使用具有固定名称的属性.然后,元类检查attrs中的这些属性并使用它们.它可以选择保留然后保留在结果类中,或此时从attrs字典中将其删除.
如果仅在运行时才知道传递元类所需的信息,则这些属性可以指向其他(模块级)变量,或包含在类创建时评估的Python表达式.
mod_server_type = "TCP"
class YAServer(ParentServer):
__metaclass__ = ServerMetaBase
_sever_type = mod_server_type
with open("config_file") as config:
_server_params = pickle.load(config)
del config
def __init__(self,...):
...
在上面的示例中,您的元类可以使用_server_type和_server_params属性来进一步控制类的创建.
内容总结
以上是互联网集市为您收集整理的python-元类配置类.但是我们可以配置元类吗?全部内容,希望文章能够帮你解决python-元类配置类.但是我们可以配置元类吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。