受保护的封装 protected

  • 受保护的封装是将对象成员进行一定级别的封装,然后在类中或者子类中都可以访问,但外部不可以
  • 封装方法: 在成员名称前添加一个下划线即可

公开的,公共的 public

  • 公共的封装实际对成员没有任何操作,任何地方都可以访问

继承

  • 继承是一个类可以获得另外一个类中的成员属性和成员方法
  • 作用 : 减少代码,增加代码的复用功能,同时可以设置类与类的直接的关系
  • 继承与被继承的概念:
  • 被继承的类,叫做父类,也叫作基类,也叫超类
  • 用于继承的类,叫做子类,也叫派生类
  • 继承与被继承一定存在一个 is——a 关系
  • 继承的语法
  • 继承的特征
  • 所有的类都继承自object类,即所有类都是object的子类
  • 子类一旦继承父类,则可以使用父类中除私有成员外的所有内容
  • 子类继承父类后并没有将父类成员完全赋值给子类中,而是通过引用关系访问调用
  • 子类中可以定义独有的成员属性和方法
  • 子类中成员与父类中成员相同则优先使用子类
  • 子类如果想扩充父类方法,可以在定义新方法的同时访问父类成员来进行代码重用,可以使用 父类名.父类成员 的格式来调用父类成员,也可以使用super().父类成员 的格式来调用
  • 继承变量函数的查找顺序
  • 优先查找自己的变量
  • 没有则查找父类
  • 构造函数如果本类中没有定义,则自动查找调用父类构造函数
  • 如果本类有定义,则不再向上查找

In [1]:

 


# 继承语法


#在Python中,任何一个类都有一个共同的类叫object


class Person():
 
name = 'Noname'
 
age = 12
 
def sleep(self):
 
print('sleeping...')
 
#父类写在括号里
 
class Teacher (Person):
 
#子类中的独有成员函数
 
def make_test(self):
 
pass
 

 
t = Teacher()
 
print()
 
print()
 
 
 
Noname
Noname
 
In [7]:
 
 
class Person():
 
name = 'Noname'
 
age = 12
 
__score = 100 #成绩属于私有成员,只能自己访问
 
_petname = 'goudan' #小名属于受保护的,不能外部访问
 
def sleep(self):
 
print('sleeping...')
 
#父类写在括号里
 
class Teacher (Person):
 
#子类中的独有成员函数
 
def make_test(self):
 
pass
 

 
t = Teacher()
 
print()
 
print(t._petname)
 
t.sleep()
 
print(t.__score) #私有无法访问报错
 
 
 
Noname
goudan
sleeping...
 
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-f6a778bb0e74> in <module>()
     16 print(t._petname)
     17 t.sleep()
---> 18 print(t.__score) #私有无法访问报错
     19 

AttributeError: 'Teacher' object has no attribute '__score'
 
In [11]:
 
 
#子类可以有自己的属性与方法
 
class Person():
 
name = 'Noname'
 
age = 12
 
def sleep(self):
 
print('sleeping...')
 
#父类写在括号里
 
class Teacher (Person):
 
#子类中的独有成员函数
 
teacher_id = 343
 
def make_test(self):
 
print('attention')
 

 
t = Teacher()
 
print()
 
print(t.teacher_id)
 
t.make_test()  #调用成员函数方法
 
 
 
Noname
343
attention
 
In [14]:
 
 
#子类与父类中变量名称相同
 
class Person():
 
name = 'Noname'
 
age = 12
 
def sleep(self):
 
print('sleeping...')
 
#父类写在括号里
 
class Teacher (Person):
 
#子类中的独有成员函数
 
name = 'goudan' #名称相同
 
def make_test(self):
 
pass
 

 
t = Teacher()
 
print()
 
print()
 
 
 
goudan
Noname
 
In [24]:
 
 
#子类扩充父类功能
 
class Person():
 
name = 'Noname'
 
age = 12
 
def sleep(self):
 
print('sleeping...')
 
 
 
def work(self):
 
print('make some money')
 
#父类写在括号里
 
class Teacher(Person):
 
#子类中的独有成员函数
 
def make_test(self):
 
print('attention')
 
def work(self):
 
#扩充父类功能只需要调用父类相应函数
 
Person.work(self) # 还可以使用 super().work() 来得到目的,super() 即代表父类
 
self.make_test()
 

 
t = Teacher()
 
t.work()
 
 
 
make some money
attention
 
构造函数
• 是一类特殊的函数,在类实例化之前进行调用
• 如果定义了构造函数,则实例化时使用构造函数,不查找父类
• 如果子类不带,父类带,则构造对象时的参数应该按父类参数构造
In [25]:
 
 
# 构造函数的概念
 
class Dog():
 
#__init__就是构造函数,格式固定
 
#每次实例化时第一个被自动调用
 
#主要工作是进行初始化
 
def __init__(self):#必须有参数
 
print('I am init in dog')
 
#实例化时,括号内的参数需要跟构造函数参数匹配
 
kaka = Dog()
 
I am init in dog
 
In [26]:
 
 
 
 
#继承中的构造函数 - 1
 
class Anim():
 
pass
 
class PaxingAnim(Anim):
 
pass
 
class Dog(PaxingAnim):
 
def __init__(self):
 
print('I am init in dog')
 
#实例化的时候,自动调用了Dog的构造函数
 
kaka = Dog()
 
I am init in dog
 
In [31]:
 
 
 
 
#继承中的构造函数 - 2
 
class Anim():
 
def __init__(self):
 
print('dongwu')
 
class PaxingAnim(Anim):
 
def __init__(self):
 
print('wo kao pa')
 
class Dog(PaxingAnim):
 
def __init__(self):
 
print('I am init in dog')
 
#注意,在自身找到了构造函数,所以不在父类查找
 
kaka = Dog ()
 

 
#没有定义构造函数,则去父类中进行查找,找到即停止
 
class Cat(PaxingAnim):
 
pass
 
haha = Cat()
 
I am init in dog
wo kao pa
 
In [38]:
 
 
 
 
#继承中的构造函数 - 3
 
class Anim():
 
def __init__(self):
 
print('dongwu')
 
class PaxingAnim(Anim):
 
def __init__(self,name):#注意参数需要匹配
 
print('wo kao pa {0}'.format(name))
 
class Dog(PaxingAnim):
 
def __init__(self):
 
print('I am init in dog')
 
#本身有构造函数企且匹配
 
d = Dog()
 

 

 
class Cat(PaxingAnim):
 
pass
 
#参数匹配
 
name = 'gogo'
 
haha = Cat(name)
 
#参数不匹配,报错
 
haha = Cat()
 
I am init in dog
wo kao pa gogo
 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-38-017e2b6ebfdb> in <module>()
     19 haha = Cat(name)
     20 #参数不匹配,报错
---> 21 haha = Cat()

TypeError: __init__() missing 1 required positional argument: 'name'


super

  • super不是关键字,而是一个类
  • super的作用是获取MRO列表中的第一个类
  • super与父类没有直接任何实质性3关系,但是通过super可以调用到父类