python创建实例属性_Python:如何通过元类创建实例属性?

本文探讨了一种使用元类和Property类来自动创建属性的方法,以减少代码重复。通过定义AutoPropertyMeta元类和Property类,可以自动生成getter和setter方法,当尝试设置属性值时确保类型检查。在初始化类实例时,AutoPropertyMeta元类会根据Property实例生成实例属性。这种方法适用于属性值总是在设置后被获取的情况,因为它在第一次设置值时创建实例属性。
摘要由CSDN通过智能技术生成

我正在使用元类为这样的新类创建属性:class Property(object):

def __init__(self, internal_name, type_, default_value):

self._internal_name = internal_name

self._type = type_

self._default_value = default_value

def generate_property(self):

def getter(object_):

return getattr(object_, self._internal_name)

def setter(object_, value):

if not isinstance(value, self._type):

raise TypeError("Expect type {0}, got {1}.".format(self._type, type(value)))

else:

setattr(object_, self._internal_name, value)

return property(getter, setter)

class AutoPropertyMeta(type):

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

for name, value in attributes.iteritems():

if isinstance(value, Property):

attributes[name] = value.generate_property()

return super(AutoPropertyMeta, cls).__new__(cls, name, bases, attributes)

这样我就可以写这样的代码:

^{pr2}$

而不是:class SomeClassWithALotAttributes(object):

def __init__(self):

self._attribute_a = 0

...

self._attribute_z = 1.0

def get_attribute_a(self):

return self._attribute_a

def set_attribute_a(self, value):

if not isinstance(value, int):

raise TypeError("Expect type {0}, got {1}.".format(self._type, type(value))

else:

self._attribute_a = value

attribute_a = property(get_attribute_a, set_attribute_a)

...

如果您总是在获取属性值之前设置值,那么它会非常有效,因为AutoPropertyMeta只生成getter和{}方法。实际实例属性是在第一次设置该值时创建的。所以我想知道是否有一种方法可以通过元类为类创建实例属性。在

下面是我现在使用的一种解决方法,但我总是想知道是否有更好的方法:class Property(object):

def __init__(self, internal_name, type_, default_value):

self._internal_name = internal_name

self._type = type_

self._default_value = default_value

def generate_property(self):

def getter(object_):

return getattr(object_, self._internal_name)

def setter(object_, value):

if not isinstance(value, self._type):

raise TypeError("Expect type {0}, got {1}.".format(self._type, type(value)))

else:

setattr(object_, self._internal_name, value)

return property(getter, setter)

def generate_attribute(self, object_):

setattr(object_, self._internal_name, self._default_value)

class AutoPropertyMeta(type):

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

property_list = []

for name, value in attributes.iteritems():

if isinstance(value, Property):

attributes[name] = value.generate_property()

property_list.append(value)

attributes["_property_list"] = property_list

return super(AutoPropertyMeta, cls).__new__(cls, name, bases, attributes)

class AutoPropertyClass(object):

__metaclass__ = AutoPropertyMeta

def __init__(self):

for property_ in self._property_list:

property_.generate_attribute(self)

class SomeClassWithALotAttributes(AutoPropertyClass):

attribute_a = Property("_attribute_a", int, 0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值