私有属性和方法:
对象里面有的方法不希望在对象的外部被访问,只在对象内部使用
定义方式:
在定义属性和方法时,在属性名或者方法名前面增加两个下划线,就代表定义的是私有的属性或方法。
例如:
class women:
def __init__:
self.__name = name
self.__age = 18
def women_info(self):
print('我的名字是{},我的年龄是{}'.format(self.__name,self.__age))
liuguixiang = women('刘桂香')
print(liuguixiang.age)
liuguixiang.women_info()
结果:
Exited with error status 1
File "07e8cfd7ef4fcdb35d80f8e074ae2490", line 44
def __init__:
^
SyntaxError: invalid syntax
姓名和年龄这两个属性,是私有属性。不能被外部调用。
继承:
1.单继承 2.多继承
面向对象的三大特征:
1.封装:根据职责降属性和方法封装到一个抽象的类中
2.继承:实现代码的重用,相同的代码不需要重复去编写
3.多态:不同的对象调用相同的方法,产生不同的执行结果,增加代码灵活度。
继承的概念:
子类拥有父类所有的属性和方法。
继承是有传递性的。
class Animal():
"""父类也叫做基类"""
def __init__(self):
self.name = 'nunu'
def run(self):
print('%s会跑'%self.name)
class Dog(Animal):
'子类也叫做派生类'
pass
dog = Dog()
print(dog.name)
dog.run()
结果:
nunu
nunu会跑
Dog是一个子类他继承了父类Animal的属性。
如果在创建一个子类,这个子类继承Dog类会发生什么情况?
# -*- coding: utf-8 -*-
class Animal():
"""父类也叫做基类"""
def __init__(self,name):
self.name = name
def run(self):
print('%s会跑'%self.name)
class Dog(Animal):
'子类也叫做派生类'
def eat(self):
print('吃东西')
class Jm(Dog):
pass
dog = Dog('狗')
print(dog.name)
dog.run()
print('*'*50)
jm=Jm('金毛')
jm.run()
jm.eat()
print(jm.name)
结果:
狗
狗会跑
**************************************************
金毛会跑
吃东西
金毛
会发现,Jm这个类继承了Dog类继承的属性和方法以及Dog类里的方法。
如果Dog类里面有与他的父类Animal相同的方法,那么Jm类在执行时又会产生什么样的效果呢?
# -*- coding: utf-8 -*-
class Animal():
"""父类也叫做基类"""
def __init__(self,name):
self.name = name
def run(self):
print('%s会跑'%self.name)
class Dog(Animal):
'子类也叫做派生类'
def run(self):
print('我是Dog类的run方法')
class Jm(Dog):
pass
dog = Dog('狗')
dog.run()
print('*'*50)
jm=Jm('金毛')
jm.run()
结果:
我是Dog类的run方法
**************************************************
我是Dog类的run方法
如果在子类里面已经定义了父类中已经定义的方法,那么会重写父类的方法。(可以理解为覆盖了父类的方法)
父类的私有属性会被继承吗?
class Animal():
"""父类也叫做基类"""
def __init__(self,name):
self.__name = name
def run(self):
print('%s会跑'%self.__name)
class Dog(Animal):
'子类也叫做派生类'
def run(self):
print('我是Dog类的run方法')
class Jm(Dog):
pass
dog = Dog('狗')
print(dog.name)
dog.run()
结果:
Exited with error status 1
Traceback (most recent call last):
File "bcdbd05f15c81f0eb183eaf97b4ac91e", line 22, in <module>
print(dog.name)
AttributeError: 'Dog' object has no attribute 'name'
父类的私有属性不会被继承。
如何在重写了父类方法的同时,既能访问父类方法,又能访问子类的方法呢?
super():常使用于重写父类方法时,并且也要同时调用父类中封装的同一个方法。
class Animal():
"""父类也叫做基类"""
def __init__(self,name):
self.name = name
def run(self):
print('%s会跑'%self.name)
print('我是Animal类的run方法')
class Dog(Animal):
'子类也叫做派生类'
def run(self):
print('我是Dog类的run方法')
super().run()
class Jm(Dog):
pass
dog = Dog('狗')
print(dog.name)
dog.run()
结果:
狗
我是Dog类的run方法
狗会跑
我是Animal类的run方法