python property setter_元类中的property()setter问题

我试图在元类中使用property()来提供访问/设置内部属性的方法。我使用property()作为@property的名称,因为它在元类中,我需要将该属性应用于在__new__方法中传递的类。在

这是我的代码和相关部分的基本示例:def __new__(mcls, name, bases, dct, **kwargs):

def getabstract(obj):

return getattr(obj, '_abstract', False)

def setabstract(obj, value):

if str(value) in ('True', 'False'):

return setattr(obj, '_abstract', value)

else: print(f'invalid abstract assignment {value}')

return None

cls = super().__new__(mcls, name, bases, dct)

for name, value in cls.__dict__.items():

if callable(value):

# only applies to callable (method)

value._abstract = getattr(value, '_abstract', False)

# add an _abstract attribute to the method or return its

# current value if it already has one

for base in bases:

base._abstract = getattr(base, '_abstract', False)

# give each base class an _abstract attribute if not already given

cls.abstract = property(getabstract(cls),

setabstract(cls, getattr(cls, '_abstract', False)))

# make an abstract property for class

for name, value in cls.__dict__.items():

if callable(value):

# make an abstract property for functions

value.abstract = property(getabstract(value),

setabstract(value, getattr(value, '_abstract', False)))

当我运行这个时,不会发生错误,但是当访问这个元类创建的新类时,它返回:

^{pr2}$

另外,用作setter的setabstract()函数只设置True或{}的属性,但是当我执行类似Foo.abstract = 'foo'的操作时,它仍然将值设置为'foo'

是我做错了什么还是错过了什么?在

Pythonpropertysetter是用于属性访问和修改的特殊装饰器。它们允许您以更简洁和可控的方式定义类的属性。 @property装饰器用于将一个方法转换为类的只读属性。它允许您在访问该属性时执行一些额外的逻辑。例如,假设您有一个Person类,其有一个birth_year属性,您可以使用@property装饰器来创建一个名为age的只读属性,计算该人的年龄: ```python class Person: def __init__(self, birth_year): self._birth_year = birth_year @property def age(self): current_year = datetime.datetime.now().year return current_year - self._birth_year person = Person(1990) print(person.age) # 输出: 31 ``` 在上面的示例,age方法被@property装饰器修饰,使其成为只读属性。每次访问age属性时,它将计算当前年份与出生年份之间的差值,并返回结果。 setter是@property的配套装饰器,用于定义属性的修改行为。通过setter,您可以控制对属性的赋值操作。例如,如果您希望在设置birth_year属性时进行一些验证,您可以使用setter来实现: ```python class Person: def __init__(self, birth_year): self._birth_year = birth_year @property def birth_year(self): return self._birth_year @birth_year.setter def birth_year(self, value): if value < 1900: raise ValueError("Invalid birth year") self._birth_year = value person = Person(1990) print(person.birth_year) # 输出: 1990 person.birth_year = 2000 print(person.birth_year) # 输出: 2000 person.birth_year = 1800 # 抛出ValueError异常 ``` 在上面的示例,birth_year方法被@property装饰器修饰,使其成为只读属性。然后,通过使用birth_year.setter装饰器,定义了一个名为birth_year的setter方法。在setter方法,我们可以添加自定义的验证逻辑,以确保赋值的值符合我们的要求。 通过@propertysetter装饰器,我们可以更方便地控制和验证类属性的访问和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值