为了账号安全,请及时绑定邮箱和手机立即绑定

在 3.6 之前的 Python 版本中没有 __set_name__ 的解决方法

在 3.6 之前的 Python 版本中没有 __set_name__ 的解决方法

白衣非少年 2021-08-14 15:53:04
在 Python 3.6 中,我可以使用__set_name__钩子来获取描述符的类属性名称。我如何在 python 2.x 中实现这一点?这是在 Python 3.6 中运行良好的代码:class IntField:    def __get__(self, instance, owner):        if instance is None:            return self        return instance.__dict__[self.name]    def __set__(self, instance, value):        if not isinstance(value, int):            raise ValueError('expecting integer')        instance.__dict__[self.name] = value    def __set_name__(self, owner, name):        self.name = nameclass Example:    a = IntField()
查看完整描述

2 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

您可能正在寻找元类,通过它您可以在类创建时处理类属性。


class FooDescriptor(object):

    def __get__(self, obj, objtype):

        print('calling getter')


class FooMeta(type):

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

        for k, v in attrs.iteritems():

            if issubclass(type(v), FooDescriptor):

                print('FooMeta.__init__, attribute name is "{}"'.format(k))


class Foo(object):

    __metaclass__ = FooMeta

    foo = FooDescriptor()



f = Foo()

f.foo

输出:


FooMeta.__init__, attribute name is "foo"

calling getter

如果您需要在创建类之前更改类,您需要覆盖__new__而不是__init__在您的元类中。


查看完整回答
反对 回复 2021-08-14
  • 2 回答
  • 0 关注
  • 246 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信