1、_对象名
级别:受保护的属性
使用:父类对象和子类对象都可以直接调用,父类中受保护的属性可以被子类覆盖。可以看出它的普通的属性没啥区别,但是当使用 from module_name import * 导入时,单下划线开头的变量和方法是不会被导入的。必须使用 import module_name 导入整个模块,然后可以用 module_name._对象名 来访问。
class A(object):
def __init__(self):
self.name = 'yx'
self._age = 24
self.__gender = 'm'
def _printAge(self):
print(self._age)
def __printGender(self):
print(self.__gender)
class B(A): # B继承A
def _printAge(self):
print(18)
def __printGender(self):
print('f')
a = A()
a.name
'yx'
a._age # 受保护的属性父类对象可以直接访问
24
a._printAge()
24
b = B()
b.name
'yx'
b._age # 受保护的属性子类对象可以直接访问
24
b._printAge() # 父类受保护的属性可以被子类覆盖
18
2、_ _对象名
级别:私有属性
使用:父类对象和子类对象都不能直接调用,要以 _classname _ _methodname的格式来调用,父类中的私有属性不能被子类覆盖,因为它们的名称是不同的。
class A(object):
def __init__(self):
self.name = 'yx'
self._age = 24
self.__gender = 'm'
def _printAge(self):
print(self._age)
def __printGender(self):
print(self.__gender)
class B(A):
def _printAge(self):
print(18)
def __printGender(self):
print('f')
a = A()
a.name
'yx'
a.__gender # 父类对象不能直接访问
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'A' object has no attribute '__gender'
a.__printGender()
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'A' object has no attribute '__printGender'
a._A__gender # 需要以 _classname__methodname 的格式来访问
'm'
a._A__printGender()
m
b = B()
b.name
'yx'
b.__gender # 子类对象更加不能直接访问
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'B' object has no attribute '__gender'
b.__printGender()
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'B' object has no attribute '__printGender'
b._A__gender # 需要以 _classname__methodname 的格式来访问
'm'
b._A__printGender()
m
b._B__printGender() # 父类的私有属性不能被覆盖,因为它们的名称已经变了
f