yield-bytes

沉淀、分享与无限进步

Python类私有变量覆盖特性

  此内容相对简单,仅在使用子类过程中,注意私有变量在子类继承过程的特性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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
显然父类非私有方法已被子类覆盖
"""

点击并拖拽以移动