http://python.jobbole.com/82297/
https://www.cnblogs.com/vipchenwei/p/7126772.html
https://www.cnblogs.com/wilber2013/p/4677412.html
http://my.oschina.net/jhao104/blog/682322
https://blog.csdn.net/brucewong0516/article/details/79121179
单划线_ 相当于受保护属性
双划线__ 相当于私有属性
class A(object):
a = 1
_b = 2
__c = 3
def __init__(self):
self.__private()
self.public()
self.d = 4
self._e = 5
self.__f = 6
def __private(self):
print( 'A.__private()')
def public(self):
print ('A.public()')
def _protect(self):
print('A._protect')
class B(A):
def __private(self):
print( 'B.__private()')
def public(self):
print ('B.public()')
def _protect(self):
print('B._protect')
a = A()
b = B()
print(dir(A))
print(dir(a))
print(dir(B))
print(dir(b))
输出简写了,只写了在类中出现的属性和方法,以便分析。
A.__private()
A.public()
A.__private()
B.public()
['_A__c', '_A__private', '_b', '_protect', 'a', 'public']
['_A__c', '_A__f', '_A__private', '_b', '_e', '_protect', 'a', 'd', 'public']
['_A__c', '_A__private', '_B__private', '_b', '_protect', 'a', 'public']
['_A__c', '_A__f', '_A__private', '_B__private', '_b', '_e', '_protect', 'a', 'd', 'public']
总结:1 单划线和没加单划线是一样的,只不过提醒你,它可以改变但不要轻易改变
2 双划线的属性和方法,只是隐型在前加_A,
3 双划线以加_A在子类继承
4 在类外部访问私有属性,在前加_A就行,在类内部访问不需要,类内会隐形加上。
5 双下划线的另一个重要的目地是,避免子类对父类同名属性和方法的冲突
构造函数的继承
1.经典类的写法: 父类名称.init(self,参数1,参数2,…)
2. 新式类的写法:super(子类,self).init(参数1,参数2,…)
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
self.weight = 'weight'
def talk(self):
print("person is talking....")
class Chinese(Person):
def __init__(self, name, age, language):
Person.__init__(self, name, age) #继承父类的构造方法,也可以写成:super(Chinese,self).__init__(name,age)
self.language = language # 定义类的本身属性
def walk(self):
print('is walking...')