我有Child类,它扩展了Parent,最新的implements属性描述符,并重写了Child类具有的属性(self.child_prop)。
我无法更改父类实现,我需要使用具有相同名称的属性。目前的结构表明,财产制定者'收到自我'因此,Child类可以访问上层属性。有没有办法阻止Parent访问Child的属性?
class Parent(object):
def __init__(self):
self.parent_prop = 'parent prop initialized'
def _setter(self,val):
self._local_parent_prop = val
self.child_prop = 'child value changed from parent'
print 'mro of Parent class: {0}'.format(Parent.__mro__)
print 'self in Parent belongs to {0}'.format(self.__class__)
def _getter(self):
print 'getting prop from parent'
return self._local_parent_prop
parent_body = property(_getter,_setter)
class Child(Parent):
def __init__(self):
self.child_prop = 'child prop initialized'
super(Child,self).__init__()
child = Child()
print child.child_prop
child.parent_body = 'setting parent property'
print child.child_prop # here attribute was changed from Parent
输出:
child prop initialized
mro of Parent class: (<class '__main__.Parent'>, <type 'object'>)
self in Parent belongs to <class '__main__.Child'>
child value changed from parent
答案 0 :(得分:0)
有没有办法阻止Parent访问Child的属性?
没有。这不是Python哲学。您可以询问任何对象的任何属性,如果存在,解释器将使用它。这意味着如果父类可以知道当前对象实际上是子类实例或者具有特定属性,那么它可以访问它。
但是作为程序员,你不应该:从父类访问子类属性是非常糟糕的做法,因为它打破了封装原理。