gpt4 book ai didi

python - 从内置类型派生时如何设置 "the"值?

转载 作者:太空宇宙 更新时间:2023-11-03 15:43:57 25 4
gpt4 key购买 nike

我正在(尝试)进行一些元编程,在我尝试进行一组之前,一切似乎都正常。

class MetaField(type):

def __new__(meta, clsname, bases, attrs):
bases = (Field,) + bases
return super(MetaField, meta).__new__(meta, clsname, bases, attrs)

def __call__(cls, *args, **kw):
cls._primary_key = kw.pop('primary_key', False)
return super(MetaField, cls).__call__(*args, **kw)

class Field(object):

def __new__(cls, *args, **kw):
return super(Field, cls).__new__(cls, *args)

#def __set__(self, instance, value):
# magic needs to go here

#def __get__(self, instance, owner):
# more magic here

@property
def primary_key(self):
return self._primary_key

class IntField(int):
__metaclass__ = MetaField

class SomeObject(object):
# trying with descriptors here
i = IntField(10, primary_key=True, foo='set')


obj = SomeObject()
assert obj.i == 10
assert obj.i.primary_key == True

obj.i = 11
assert obj.i == 11

assert obj.i.primary_key == True
AttributeError: 'int' object has no attribute 'primary_key'

这是有道理的,因为 obj.i 不再是 IntField 而是一个普通的 int

所以在 Field.__set__ 中,如果我可以做一些类似的事情super(self) = valueself 仍然是一个 IntField 这将是 super 骗子。

我尝试实现一个ProxyFieldDescriptor,如所述 http://blog.kevinastone.com/django-model-descriptors.html但是当您从 __get__ 返回时,您会丢失所有补充信息,例如 _primary_key

如何从派生类中设置 int 的实际值?

最佳答案

首先,如果您在生产代码上执行此操作,您可能会陷入开发者 hell 。其次,这就是您想要做的事情:

class MetaField(type):
def __new__(meta, clsname, bases, attrs):
bases = (Field,) + bases
return super(MetaField, meta).__new__(meta, clsname, bases, attrs)

def __call__(cls, *args, **kw):
cls._primary_key = kw.pop('primary_key', False)
cls._name = kw.pop('name')
return super(MetaField, cls).__call__(*args, **kw)


class Field(object):

def __getattr__(self, item):
if item == 'primary_key':
return self._primary_key
else:
return self.__dict__[item]

def __set__(self, instance, value):
instance.__dict__[self._name] = IntField(value, primary_key=self.primary_key, name=self._name)


class IntField(int):
__metaclass__ = MetaField


class SomeObject(object):
# trying with descriptors here
i = IntField(10, primary_key=True, name='i')


if __name__ == '__main__':
obj = SomeObject()
assert obj.i == 10
assert obj.i.primary_key == True

obj.i = 11
assert obj.i == 11

assert obj.i.primary_key == True
# g2g

这里的关键是,正如描述符的常见情况一样,您需要为它们命名。如果您不命名它们,则在需要设置/获取实例变量时无法访问实例变量。如果这不是问题,那么您就不需要名字。但在这种情况下你会这样做。我做了必要的调整。

尽管我确信您很清楚这一点,但还有更简单的方法可以完成您想要完成的任务......这是黑暗面的道路。

关于python - 从内置类型派生时如何设置 "the"值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41918797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com