面向对象的三大特性:封装,继承,传递
1.python中的封装:把现实世界中的主体中的属性和方法书写到类的里面的操作。可以为属性和方法添加为私有权限。
class Person():
# 封装属性
# 封装方法
封装中的私有属性和私有方法:
在面向对象代码中,我们可以把属性和方法分为两大类:公有(属性、方法)和私有(属性、方法)
公有属性和公有方法:无论在类的内部还是在类的外部我们都可以对属性和方法进行操作。
但是有些情况下,我们不希望在类的外部对类内部的属性和方法进行操作。我们就可以把这个属性或方法封装成私有形式。
私有方法的定义方式与私有属性基本一致,在方法名的前面添加两个下划线__方法名()
私有属性的访问限制:
设置私有属性和私有方法的方式非常简单:在属性名和方法名 前面 加上两个下划线 __ 即可。
基本语法:
class Girl():
def __init__(self, name):
self.name = name
self.__age = 18
xiaomei = Girl('小美')
print(xiaomei.name)
print(xiaomei.__age) # 报错,提示Girl对象没有__age属性
私有属性设置与访问接口:
在Python中,一般定义函数名’ get_xx ‘用来获取私有属性,定义’ set_xx '用来修改私有属性值。
class Girl():
def __init__(self, name):
self.name = name
self.__age = 18
# 公共方法:提供给外部的访问接口
def get_age(self):
# 本人访问:允许直接访问
# 外人访问:加上限制条件
return self.__age
# 公共方法:提供给外部的设置接口
def set_age(self, age):
self.__age = age
girl = Girl('小美')
girl.set_age(19)
print(girl.get_age())
封装的意义:
- 以面向对象的编程思想进行项目开发。
封装数据属性:明确的区分内外,控制外部对隐藏的属性的操作行为(过滤掉异常数据)
class People():
def __init__(self, name, age):
self.__name = name
self.__age = age
def tell_info(self):
print('Name:<%s> Age:<%s>' % (self.__name, self.__age))
# 对私有属性的访问接口
def set_info(self, name, age):
if not isinstance(name, str):
print('名字必须是字符串类型')
return
if not isinstance(age, int):
print('年龄必须是数字类型')
return
self.__name = name
self.__age = age
p = People('jack', 38)
p.tell_info()
p.set_info('jennifer', 18)
p.tell_info()
p.set_info(123, 35)
p.tell_info()
私有方法封装的意义:降低程序的复杂度
class ATM:
def __card(self):
print('插卡')
def __auth(self):
print('用户认证')
def __input(self):
print('输入取款金额')
def __print_bill(self):
print('打印账单')
def __take_money(self):
print('取款')
# 定义一个对外提供服务的公共方法
def withdraw(self):
self.__card()
self.__auth()
self.__input()
self.__print_bill()
self.__take_money()
atm = ATM()
atm.withdraw()
python中的继承:
类是用来描述现实世界中同一组事务的共有特性的抽象模型,但是类也有上下级和范围之分,比如:生物 => 动物 => 哺乳动物 => 灵长型动物 => 人类 => 黄种人
从哲学上说,就是共性与个性之间的关系,比如:白马和马!所以,我们在OOP代码中,也一样要体现出类与类之间的共性与个性关系,这里就需要通过类的继承来体现。简单来说,如果一个类A使用了另一个类B的成员(属性和方法),我们就可以说A类继承了B类,同时这也体现了OOP中代码重用的特性!
继承的基本语法:
假设A类要继承B类中的所有属性和方法(私有属性和私有方法除外)
class B(object):
pass
class A(B):
pass
a = A()
a.B中的所有公共属性
a.B中的所有公共方法
1. 继承:一个类从另一个已有的类获得其成员的相关特性,就叫作继承!
2.派生:从一个已有的类产生一个新的类,称为派生!继承和派生其实就是从不同的方向来描述的相同的概念而已,本质上是一样的!
3.父类:也叫作基类,就是指已有被继承的类!
4.子类:也叫作派生类或扩展类
5.扩展:在子类中增加一些自己特有的特性,就叫作扩展,没有扩展,继承也就没有意义了!
6.单继承:一个类只能继承自一个其他的类,不能继承多个类,单继承也是大多数面向对象语言的特性!
#基本语法
# 1、定义一个共性类(父类)
class Person(object):
pass
# 2、定义一个个性类(子类)
class Teacher(Person):
pass
#案例:比如汽车可以分为两种类型(汽油车、电动车)
# 1、定义一个共性类(车类)
class Car(object):
def run(self):
print('i can run')
# 2、定义汽油车
class GasolineCar(Car):
pass
# 3、定义电动车
class EletricCar(Car):
pass
bwm = GasolineCar()
bwm.run()
特性:传递性
在Python继承中,如A类继承了B类,B类又继承了C类。则根据继承的传递性,则A类也会自动继承C类中所有公共的属性和方法
class C(object):
def func(self):
print('我是C类中的相关方法func')
class B(C):
pass
class A(B):
pass
a = A()
a.func()
7.多继承:一个类同时继承了多个父类, (C++、Python等语言都支持多继承)
#基本语法:
class B(object):
pass
class C(object):
pass
class A(B, C):
pass
a = A()
a.B中的所有属性和方法
a.C中的所有属性和方法
#案例:汽油车、电动车 => 混合动力汽车(汽车 + 电动)
class GasolineCar(object):
def run_with_gasoline(self):
print('i can run with gasoline')
class EletricCar(object):
def run_with_eletric(self):
print('i can run with eletric')
class HybridCar(GasolineCar, EletricCar):
pass
tesla = HybridCar()
tesla.run_with_gasoline()
tesla.run_with_eletric()
super()调用父类属性和方法:
super():调用父类属性或方法,完整写法:super(当前类名, self).属性或方法(),在Python3以后版本中,调用父类的属性和方法我们只需要使用super().属性或super().方法名()就可以完成调用了。
案例:Car汽车类、GasolineCar汽油车、ElectricCar电动车
class Car(object):
def __init__(self, brand, model, color):
self.brand = brand
self.model = model
self.color = color
def run(self):
print('i can run')
class GasolineCar(Car):
def __init__(self, brand, model, color):
super().__init__(brand, model, color)
def run(self):
print('i can run with gasoline')
class ElectricCar(Car):
def __init__(self, brand, model, color):
super().__init__(brand, model, color)
# 电池属性
self.battery = 70
def run(self):
print(f'i can run with electric,remain:{self.battery}')
bwm = GasolineCar('宝马', 'X5', '白色')
bwm.run()
tesla = ElectricCar('特斯拉', 'Model S', '红色')
tesla.run()
综合案例
1.需求分析:设计一个Game类。
2.属性:
定义一个类属性top_score记录游戏的历史最高分
定义一个实例属性player_name记录当前游戏的玩家姓名
3.方法:
静态方法show_help显示游戏帮助信息
类方法show_top_score显示历史最高分
实例方法start_game开始当前玩家的游戏
代码:
class Game(object):
# 1、定义类属性top_score
top_score = 0
# 2、定义初始化方法__init__
def __init__(self, player_name):
self.player_name = player_name
# 3、定义静态方法,用于输出帮助信息
@staticmethod
def show_help():
print('游戏帮助信息')
# 4、定义类方法
@classmethod
def show_top_score(cls):
print(f'本游戏历史最高分:{cls.top_score}')
# 5、定义实例方法,start_game()
def start_game(self):
print(f'{self.player_name},游戏开始了,你准备好了么?')
# 实例化类生成实例对象
mario = Game('itheima')
mario.start_game()
# 显示历史最高分
Game.show_top_score()
# 弹出游戏帮助信息
Game.show_help()