python类 属性 默认_Python元类默认属性

我正在尝试在 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值