此内容相对简单,仅在使用子类过程中,注意私有变量的特性
class Person(object):
__name='Foo' # 命名空间变为:_Person__name
def __init__(self):
self.__age=10 # 命名空间变为:_Person__age
def __height(self): # 命名空间变为:_Person__height
print('form',self.__class__.__name__)
return '180cm'
def outside_access(self): # 类内部访问类的私有方法或者私有数据属性
print('form',self.__class__.__name__)
return self.__height()
print(Person.__dict__)
'''
{'_Person__name': 'Foo', '__doc__': None, '__module__': '__main__',
'__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>,
'__init__': <function Person.__init__ at 0x1143171e0>,
'_Person__height': <function Person.__height at 0x114317268>,
'outside_access': <function Person.outside_access at 0x1143172f0>}
'''
p=Person()
# print(p.__name) # Person' object has no attribute '__name'
# print(p.__height) # Person' object has no attribute '__height'
"""
Python 为何要在类私有变量前加上类名作为变量名称
目的:当子类覆盖父类时,保证了子类的同名私有变量_subclass__Foo不会覆盖同名的_parentclass__Foo
或者说:父类不想让子类覆盖自己的方法,可通过将方法私有化达到目的,这个子类指:同一模块内的方法,或被引入到其他模块当中的子类
"""
class SubPerson(Person):
def __height(self):
return '170cm'
def outside_access(self): # 类内部访问类的私有方法或者私有数据属性
print('form',self.__class__.__name__)
return self.__height()
s=SubPerson()
print(s._Person__height())
# 打印结果:180cm
print(s._SubPerson__height())
# 打印结果:170cm
# 说明父类__height方法与子类的_height完全独立
print(s.outside_access())
"""
打印结果:
form SubPerson
170cm
显然父类非私有方法已被子类覆盖
"""