python怎么设置属性_python在创建新对象时设置属性__

当使用“new”自定义创建元类时,我们可以将属性传递给type()。“new”方法,该方法将在返回对象之前设置在对象上,例如。

class Foo(type):

def __new__(cls, name, bases, attrs):

attrs['customAttr'] = 'someVal'

return type.__new__(cls, name, bases, attrs)

以便:

>> Foo.__dict__

{'customeAttr': 'someVal', ...}

但是,我不知道如何对普通(非元)类执行相同的操作,这会导致在使用setattr时出现问题:

class Bar(object):

def __new__(cls, someVal):

obj = object().__new__(cls) # cant pass custom attrs

obj.customAttr = someVal # obj is already a Bar and invokes __setattr__

return obj

def __setattr__(*args): raise Exception('read-only class')

所以不幸的是:

>>> Bar(42)

...

Exception: read-only class

在bar的“new”中,我从object()中得到一个成熟的类实例,任何属性访问都要经过正常的查找规则,在本例中调用“setattr”。元类foo避免了这一点,因为type()将在低级创建期间返回实例之前设置属性,而object()则不会。

是否有将属性传递给object()的方法,或者我可以使用另一种类型作为从“new”返回的实例,它允许在成为完整类实例之前设置属性?我对解决方案不感兴趣,比如在创建实例后设置类。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值