【发布时间】:2018-07-07 11:48:27
【问题描述】:
我有 A 的子类 str 以通过 kwargs 添加元数据
class A(str):
def __new__(cls, value, **kwargs):
obj = str.__new__(cls, value)
obj.__dict__.update(kwargs)
return obj
喜欢使用:
x = A('test', meta=10)
x.meta
10
现在,我也想处理unicode 类型,所以我采用了以下方法。动态检查类型并将其用作base_class
class B(object):
def __new__(cls, value, **kwargs):
base_class = str if isinstance(value, str) else unicode
new_type = type(cls.__name__, (base_class,), dict(cls.__dict__))
obj = base_class.__new__(new_type, value)
obj.__dict__.update(kwargs)
return obj
但是,这似乎是不正确的做法。给我一个
TypeError:“B”对象的描述符“dict”不适用于“B”对象
B('test', meta=10)
-----------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-533-206366568616> in <module>()
----> 1 B('tes', a=10).a
<ipython-input-528-91dc8e50cb78> in __new__(cls, value, **kw)
11 new_type = type(cls.__name__, (base_class,), dict(cls.__dict__))
12 obj = base_class.__new__(new_type, value)
---> 13 obj.__dict__.update(kw)
14 return obj
15
TypeError: descriptor '__dict__' for 'B' objects doesn't apply to 'B' object
我可以改用setattr 来使用C 类,效果很好。
class C(object):
def __new__(cls, value, **kw):
base_class = str if isinstance(value, str) else unicode
new_type = type(cls.__name__, (base_class,), dict(cls.__dict__))
obj = base_class.__new__(new_type, value)
for k, v in kw.items():
setattr(obj, k, v)
return obj
x = C('test', meta=10)
x.meta
10
您能否帮助我了解我在 class B 上遗漏了什么以及如何使用 __dict__?
【问题讨论】:
-
这里给出了为什么你会遇到这个错误的解释:stackoverflow.com/questions/45481440/…你能解释一下你还想对这个类做什么(除了给它添加一个属性吗?)因为有可能完全不同的方法可以实现您想要的。
-
您使用的是 Python 2 还是 Python 3?后者没有内置的
unicode类型。 -
这对我来说是“使用组合,而不是继承”。但即使你觉得有必要使用继承,为什么要在
__new__中动态创建一个新类型(顺便说一句,每个实例都是唯一的)?这对我来说意义不大。只需使用工厂模式,并显式定义两个派生类型。 -
注意,
x = C('test', meta=10); y = C('test', meta=10); print(isinstance(y, C), isinstance(x, C)); print(type(x) == type(y))...
标签: python class unicode subclass built-in