首页 / PYTHON / Python元类默认属性
Python元类默认属性
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python元类默认属性,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2097字,纯文字阅读大概需要3分钟。
内容图文
我正在尝试在Python(2.7)中创建元类,该类将设置传递给对象__init__的参数作为对象属性.
class AttributeInitType(type):
def __call__(self, *args, **kwargs):
obj = super(AttributeInitType, self).__call__(*args, **kwargs)
for k, v in kwargs.items():
setattr(obj, k, v)
return obj
用法:
class Human(object):
__metaclass__ = AttributeInitType
def __init__(self, height=160, age=0, eyes="brown", sex="male"):
pass
man = Human()
问题:我希望人实例具有在类的__init__中设置的默认属性.我该怎么做?
更新:我已经找到了更好的解决方案:
>在类创建期间仅检查__init__方法一次
>不会覆盖(可能)由类的实际__init__设置的属性
这是代码:
import inspect
import copy
class AttributeInitType(type):
"""Converts keyword attributes of the init to object attributes"""
def __new__(mcs, name, bases, d):
# Cache __init__ defaults on a class-level
argspec = inspect.getargspec(d["__init__"])
init_defaults = dict(zip(argspec.args[-len(argspec.defaults):], argspec.defaults))
cls = super(AttributeInitType, mcs).__new__(mcs, name, bases, d)
cls.__init_defaults = init_defaults
return cls
def __call__(mcs, *args, **kwargs):
obj = super(AttributeInitType, mcs).__call__(*args, **kwargs)
the_kwargs = copy.copy(obj.__class__.__init_defaults)
the_kwargs.update(kwargs)
for k, v in the_kwargs.items():
# Don't override attributes set by real __init__
if not hasattr(obj, k):
setattr(obj, k, v)
return obj
解决方法:
您将需要内省__init__方法并从中提取任何默认值. getargspec function将会对您有所帮助.
getargspec函数(除其他外)返回参数名称列表和默认值列表.您可以将它们结合起来以找到给定函数的默认参数规范,然后使用该信息来设置对象的属性:
import inspect
class AttributeInitType(type):
def __call__(self, *args, **kwargs):
obj = super(AttributeInitType, self).__call__(*args, **kwargs)
argspec = inspect.getargspec(obj.__init__)
defaults = dict(zip(argspec.args[-len(argspec.defaults):], argspec.defaults))
defaults.update(kwargs)
for key, val in defaults.items():
setattr(obj, key, val)
return obj
使用上面的元类,您可以忽略任何参数,它们将在新实例上设置,或者您可以通过显式传递它们来覆盖它们:
>>> man = Human()
>>> man.age
0
>>> man.height
160
>>> Human(height=180).height
180
内容总结
以上是互联网集市为您收集整理的Python元类默认属性全部内容,希望文章能够帮你解决Python元类默认属性所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。