如何解决帮助python继承
| 给定任意对象:class Val(object):
def __init__(self):
this_val = 123
我想创建一个抽象的基类,其属性为Val()
:
class A(object):
foo = Val()
我希望当我的孩子从那个班级继承时,他们会得到Val()
的副本。例如:
class B(A):
pass
class C(A):
pass
我期望以下行为:
>>> b = B()
>>> c = C()
>>> c.foo.this_val = 456
>>> b.foo.this_val
123
但是我得到了:
>>> b.this_val
456
我知道我可以在init中加入“ 7”来实现该行为,但是我有一个要求foo必须保持属性(在Django中是模型管理器)。有人可以为此建议一个解决方法吗?
编辑:我真的需要能够作为类属性访问值,所以我想要的行为是:
>>> C.foo.this_val = 456
>>> B.foo.this_val
123
解决方法
也许使用描述符可以满足您的要求:
class Val(object):
def __init__(self):
self.this_val = 123
class ValDesc(object):
def __init__(self):
self.cls_lookup = {}
def __get__(self,obj,objtype=None):
return self.cls_lookup.setdefault(objtype,Val())
class A(object):
foo = ValDesc()
class B(A):
pass
class C(A):
pass
现在,只要确保不设置任何对象的实例属性\“ foo \”,它们就会具有每个子类各自的类属性:
b = B()
c = C()
cc = C()
c.foo.this_val = 456
print c.foo.this_val # 456
print cc.foo.this_val # 456
print b.foo.this_val # 123
编辑:经过几个小时前的编辑,将__get__
中的键更改为objtype
而不是obj.__class__
,这在直接访问类属性时也可以使用:
print B.foo.this_val # 123
print C.foo.this_val # 456
,属性“ 15”仅存在于“ 16”上。您将必须使用元类向每个类添加新的17。
class Val(object):
def __init__(self):
self.this_val = 123
class MC(type):
def __init__(self,name,bases,d):
super(MC,self).__init__(name,d)
self.foo = Val()
class A(object):
__metaclass__ = MC
class B(A):
pass
B.foo.this_val = 456
print A.foo.this_val
print B.foo.this_val
,两者都做。
使其成为类属性,但还要在__init__
函数中将其初始化为新实例。这样,存储的参考不是共享的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。