欢迎观看,欢迎指正,共同学习
面向对象
定义:面向对象就是一种编程思维,使用面向对象方式就是尽可能地模拟现实世界
面向过程和面向对象的区别:面向过程是编程基础、侧重过程,而面向对象就是对面向过程的再次封装处理,通过对象来模拟现实世界
类和对象
定义:
类:类是一类事物的统称,抽象的概念
对象:类的具体体现,具体事物的实例
类和对象关系:先有类,再根据类创建对象
(实例)方法概念:本质是一个特殊的函数(特殊1、放到class类中 2、第一个形参位置默认传入self)
步骤
1、格式:#定义类
class 类名:
#属性
#方法
如果暂时不写代码,必须用pass占位,否则报错
2、根据类创建对象
对象名 = 类名()
3、使用对象
对象名.对象属性
对象名.实例方法名()
类的三种定义方式:
class 类名(object): ---object是所有类的父类,类名继承object类
class 类名():
class 类名:
ip查看的是10进制
对象默认打印的是16进制
id(对象)查看的是10进制
selef是python内置的关键字,用于指向对象实例本身
self不需要程序员手动传参,python解释器自动把该方法的对象地址传给self
属性
实例属性的添加和获取:
类外:添加-> 对象名.实例属性名 = 值 获取->实例属性名
类内: 添加-> self.实例属性名 = 值 获取->self
魔法方法
特点:总是被双下划线所包围,特殊情况下爱被调用
_ _init_ _() 添加实例属性,创建对象的时候自动执行
_ _str_ _() 将默认打印对象的地址转换为字符串 需要用return返回值
_ _del_ _() GC回收站在对象引用次数为0的时候,自动回收(在删除对象的时候自动执行)
手动删除
del 变量名
面向对象的三大特性
封装
定义:将属性和方法书写到类的里面的操作,封装可以为属性和方法添加私有权限
保护
私有属性:_ _ 属性名
私有方法:_ _方法名()
私有属性或私有⽅法不继承给⼦类
私有属性和方法使用规则:
只能在类的内部使用,不能在类的外部使用;
如果想在类的外部使用通过公共接口
私有属性的意义:明确的区分内外,控制外部对隐藏的属性的操作行为
私有方法的意义:简化调用代码,降低程序复杂度
继承
定义:子类默认继承父类的所有属性和方法,与此同时子类也可以重写父类属性和方法。
拿来即用
基本语法:
#父类B
class B(object):
pass
#子类A
class A(B):
pass
继承:一个类从另一个已有的类获得其成员的相关特性
派生:从一个已有的类产生一个新的类
父类:也叫作基类,就是指已有被继承的类
子类:也叫作派生类或扩展类
扩展:在子类中增加一些自己特有的特性,就叫作扩展,没有扩展,继承也就没有意义了
单继承:一个类只继承自一个父类
多继承:一个类同时继承了多个父类
重写父类属性:
重写也叫作覆盖,就是当子类成员与父类成员名字相同的时候,从父类继承下来的成员会重新定义 ---注意:子类重写后。父类对应的方法还在
super():调用父类属性或方法,完整写法:super(当前类名, self).方法()
子类调用父类方法有几种?
a.直接通过父类名称调用
b.通过super()进行调用
如果子类没有任何重写操作,默认调用子类的同名方法
子类调用父类的同名方法:
1、super().父类同名方法()---super(当前类名,self)注意:当前子类名,self可省略
2、类名.父类同名方法()
注意:super()只能找到第一个父类的同名方法
如果要同时调用多个父类的同名方法,必须用父类名.父类方法名
重写包含扩写
通过mro()或者_ _mro_ _属性获取继承关系
print(对象名.mro())
print(对象名._ _mro_ _)
多态
多台的前提是继承
定义:多态是同一类事物具有的多种形态。
子类要重写父类
调用不同子类对象的相同父类方法,表现出不同的状态,称为多态。
三要素:
1、有继承
2、函数重写
3、父类引用指向子类对象----#Animal ani = Dog()或者Animal ani = Cat()
python是动态语言
Python中是伪多态,因为python是弱类型语言,但java要严格要求,因为其是强类型语言
好处:简化代码
面相对象的其它特性
1、实例属性
位置:
类外:用对象.实例属性名 = 初始值
实例方法内:self.实例属性名 = 初始值值
修改:
类外:用对象.实例属性名 = 新值
实例方法内:self.实例属性名 = 新值
获取
类外:用对象.实例属性名
实例方法内:self.实例属性名
2、类属性
位置:
类外:类名.类属性名 = 初始值
类中方法外:类属性名 = 初始值
修改:
类内外:类名.类属性名 = 新值
获取:
类名.类属性名
类外:用对象.实例属性名
实例方法内:self.实例属性名
注意:如果用对象或者self修改类属性,本质是新增了一个和类属性同名的实力属性而已
3、实例方法
特点:第一个形参位置是self
调用:
1、对象或者self.实例方法名()
2、类名.实例方法名(必须传入对象)
4、类方法
特点:第一个形参位置是cls
调用:
1、类名.类方法名()
2、对象或者self.类方法名()
必须使用类装饰器:@classmethod
类方法一般都是配合类属性使用
5、静态方法
特点: 第一个形参位置没有固定的self或者cls了
调用
1、类名.类方法名()
2、对象或者self.类方法名()
必须使用装饰器:@staticmethod
import datetime
class game(object):
all_score = 0
def __init__(self,player_name):
self.player_name = player_name
@staticmethod
def show_help():
print('游戏帮助信息')
@classmethod
def show_all_score(cls):
print(f'截止到当前{datetime.datetime.now()}累计总积分:{cls.all_score}')
def start_game(self):
print(f'{self.player_name}玩了1次,加1分')
game.all_score += 1
game.show_help()
game.show_all_score()
s1 = game('张三')
s1.start_game()
s1.start_game()
game.show_all_score()
s2 = game('李四')
s2.start_game()
s2.start_game()
game.show_all_score()