面向对象
面向对象: java c# php
面向过程: c
python: 面向对象和面向过程
概念
test.py
num=0
def 函数名1():
函数体
def 函数名2():
函数体
# 声明类
class Person:
类体:
属性
方法
# 调用
函数名1()
函数名2()
person=Person()
面向过程:
1.英雄联盟
登录账号
选择游戏区域
选择游戏模式
进入游戏
...
2.面向对象:
世界万物皆对象
User --->类
Role --->类
武器--->类
大象放到冰箱:
面向过程:
1.打开冰箱
2.放大象
3.关门
面向对象:
大象--->类
冰箱--->类
--->电脑
面向对象编程
事物 ----> 转成电脑能够理解
真实 ----> 抽象
用户
商品
电脑高手: 类
买电脑 --->高手 --->买啦
类
特征: 是这一类事物所具有的共同的特征
动作: 同上
# 模型
class Student:
# 类属性
name="张三"
# 方法
def show(self):
print(self.name)
# 对象
'''
创建对象的格式:
对象名=类名()
'''
zhanghe=Student()
print(zhanghe)
zhanghe.show()
zhanghe.age=18 # 给属性赋值 动态给对象添加属性一种方式
print(zhanghe.age) # 取值并打印
zhangtao=Student()
print(zhangtao)
zhangtao.show()
print(zhangtao.age) # 直接打印 报错的原因: 没有添加就使用了
类属性: 存在于类模板中
对象属性: 存在在具体的对象的内存空间中
区别
1. 对象.属性名=值 ---> 给当前对象添加了一个新的属性 如果里面已经存在此属性了则覆盖原有的值
2. 直接定义在类体中添加的称作:类属性
类属性是属于Person类 ---> 模板
该类属性: 取值: 类名.属性
赋值: 类名.属性=新值
属性
类属性 ---> 模板属性
对象属性 --->对象的属性 --->对象属性使用较多
方法
__init__: 在创建每一个对象的时候都会默认调用的方法,因此现在就可以将一些初始化的动作写到此方法中
参数: self self就是一个对象 小调用这个对象就是谁
__init__是由python解释器负责调用
类名的首字母大写
所有的方法都是必须通过: 对象.方法名([参数])
__str__ 打印对象名的时候会默认调用的方法. 该方法是由返回值的,返回值是以字符串的形式返回
返回的值就是对象打印的内容
类: 特征 动作 --->封装
属性类型:
方法参数的类型:
字符串 列表 元组 字典 数值 布尔 ....
对象
1.类模型
2.定义属性,方法
属性
类属性: 对象名.属性 类名.属性名
实例属性(对象属性) 对象名.属性 --->self.name
方法
普通方法
特点
1. 可以类属性Person.sex,对象属性self.name
2. 也可以访问实例方法:self.test() 类方法: Person.class_method()
作用:
都是要依赖对象调用的方法或者属性
普通方法:
def printA(self,name):
print("======>",name)
def printA(self):
print("BBBBBBBB")
方式1:
test=Test()
test.printA("二哈") 报错
方式2:
test=Test()
test.printA() 不报错
覆盖的原则: 只要名字相同则就发生覆盖
静态方法
特点:
1.定义格式:
@staticmethod
def 方法名():
方法体
2.调用方式:
Person.static_method() ---> 通过类名访问
zhangsan=Person()
zhangsan.static_method() --->通过对象名调用
3.不能访问对象属性,可以通过类名.属性名的方式获取类属性
类方法
特点
1.格式:
@classmethod
def 方法名(cls):
方法体
2.类方法中不能访问实例属性(对象属性),对象方法
作用
只能访问类属性,而且类模型只要分配内存,类方法就存在. 就可以使用类方法做一些动作
特殊方法
__init__ : 完成对象的初始化信息,创建对象默认就调用此方法
1.子类中没有定义,则找父类的__init__
2.如果子类定义__init__,调用的就是自己 的
显式调用父类的__init__ 父类类名.__init__(参数列表)
__str__ : 打印print(对象名) ---> 在打印时看到的信息更加明确
__del__: 析构方法
1. 当空间引用计数为0的时候就会调用__del__ del 对象名
2. 自动调用__del__: 当py文件执行到最后的时候也会调用
注意:但是不建议大家自己定义__del__方法,就会破坏默认的垃圾回收机制
__call__:
特点:
1. 就是对象作为方法使用
2.__call__(self,添加其他的参数)
__new__:默认继承的是object
使用该方法创建当前实例对象,一般不重写,就算重写
也是调用父类的__new__方法,注意:一定要返回创建的对象
如果没有返回,__init__方法将不会被Python解释器调用
cls是类对象
封装
私有方法
就是在定义方法的时候,在方法名的前面"__"
外界无法访问私有属性,只有类自身可以访问__test
兄弟方法之间是可以相互访问的
私有属性
私有化: 只能在类中使用,归类私有
只要想将属性私有化则在属性前面添加两个下划线
只不过外界不能通过对象名.__属性名 但是如果想访问的话:_类名__属性名
set_xxx 设置值
get_xxx 获取值 有返回值
私有化属性,定义公有的set_xxx方法和get_xxx方法,供外界访问
私有方法:就是在定义方法的时候,在方法名的前面"__"
特点:外界无法访问私有方法,只有类自身可以访问self.__test()
继承
1. 代码复用
Animal 就是父类 基类 就会把子类中共同的代码,提取到父类中
子类继承父类:
1.格式:
class 子类(父类):
类体
2.能够继承父类中非私有属性和方法
3. 子类除了继承父类的内容,还可以定义自己的内容
4. 继承多个父类
class 子类(父类1,父类2,..):
拥有了多个父类的属性和方法(非私有)
继承允许多层继承
继承:
子类的继承父类,有多个父类,继承也可以多层继承
非私有属性和方法
同名属性
1. 对象属性:
默认子类使用的就是自己的
同名的话仍然想使用父类的
A.按照方法的调用方式是报错的
B.super().属性名 也是报错的
2. 类属性:
A. 父类.属性名 -
B. super 表示父类 super().属性名
C. super(子类名,子类对象).属性名
同名方法
1. 普通方法
2. __init__
子类的都会把父类的覆盖了,但是仍然可以使用父类,
A. 父类.方法名(参数列表) ---->必须要传递self
B. super 表示父类 super().父类方法() ---->参数中不用添加self (推荐)
C. super(子类名,子类对象).方法() ---->参数中不用添加self
多继承顺序
print(C.__mro__) # C3 查看父类的搜索顺序
print(inspect.getmro(C))
print(C.__bases__) # 获取当前C类直接父类
print(C.__base__) # 只能从左边向右边获取第一个父类 只能拿到一个
新式类
class 类名:
类体
默认继承object
父类: object
父类 :Person
子类: Student
1. 继承中如果有重名: 父类中有name属性,子类中也存在name属性,如果调用的话优先找子类本身的属性name
自身没有的话,继续会向上层父类中找
2. 同理方法也是如此
方法的重写:
发生在子类中,子类方法的名字与父类的同名,默认找就是子类自己的
新式类和经典类
1.经典类: type(实例对象)
<type 'instance'>
新式类 type(实例对象)
<class '__main__.类'>
2.经典类: __class__
__main__.B
新式类 __class__
<class '__main__.类'> 与type(实例名)相同的
3.经典类采用深度优先,新式类采用广度优先
4.新式类相同父类只执行一次构造函数,经典类重复执行多次
C是大写是类名
print(C.__mro__) # 适用于新式类
经典类
print(inspect.getmro(C))
类里面:
__init__
__str__
__del__
__call__
__new__
结合类使用:
对象.__class__ ---> 返回的对象的模型
类名.__mro__ ----> 搜索父类的顺序
类名.__bases__ --->查看当前类的直接父类
类名.__base__ --->只能看到一个父类(从左向右)
dir(): 查看类中的属性
多态能够使代码更加灵活
面向对象: java c# php
面向过程: c
python: 面向对象和面向过程
概念
test.py
num=0
def 函数名1():
函数体
def 函数名2():
函数体
# 声明类
class Person:
类体:
属性
方法
# 调用
函数名1()
函数名2()
person=Person()
面向过程:
1.英雄联盟
登录账号
选择游戏区域
选择游戏模式
进入游戏
...
2.面向对象:
世界万物皆对象
User --->类
Role --->类
武器--->类
大象放到冰箱:
面向过程:
1.打开冰箱
2.放大象
3.关门
面向对象:
大象--->类
冰箱--->类
--->电脑
面向对象编程
事物 ----> 转成电脑能够理解
真实 ----> 抽象
用户
商品
电脑高手: 类
买电脑 --->高手 --->买啦
类
特征: 是这一类事物所具有的共同的特征
动作: 同上
# 模型
class Student:
# 类属性
name="张三"
# 方法
def show(self):
print(self.name)
# 对象
'''
创建对象的格式:
对象名=类名()
'''
zhanghe=Student()
print(zhanghe)
zhanghe.show()
zhanghe.age=18 # 给属性赋值 动态给对象添加属性一种方式
print(zhanghe.age) # 取值并打印
zhangtao=Student()
print(zhangtao)
zhangtao.show()
print(zhangtao.age) # 直接打印 报错的原因: 没有添加就使用了
类属性: 存在于类模板中
对象属性: 存在在具体的对象的内存空间中
区别
1. 对象.属性名=值 ---> 给当前对象添加了一个新的属性 如果里面已经存在此属性了则覆盖原有的值
2. 直接定义在类体中添加的称作:类属性
类属性是属于Person类 ---> 模板
该类属性: 取值: 类名.属性
赋值: 类名.属性=新值
属性
类属性 ---> 模板属性
对象属性 --->对象的属性 --->对象属性使用较多
方法
__init__: 在创建每一个对象的时候都会默认调用的方法,因此现在就可以将一些初始化的动作写到此方法中
参数: self self就是一个对象 小调用这个对象就是谁
__init__是由python解释器负责调用
类名的首字母大写
所有的方法都是必须通过: 对象.方法名([参数])
__str__ 打印对象名的时候会默认调用的方法. 该方法是由返回值的,返回值是以字符串的形式返回
返回的值就是对象打印的内容
类: 特征 动作 --->封装
属性类型:
方法参数的类型:
字符串 列表 元组 字典 数值 布尔 ....
对象
1.类模型
2.定义属性,方法
属性
类属性: 对象名.属性 类名.属性名
实例属性(对象属性) 对象名.属性 --->self.name
方法
普通方法
特点
1. 可以类属性Person.sex,对象属性self.name
2. 也可以访问实例方法:self.test() 类方法: Person.class_method()
作用:
都是要依赖对象调用的方法或者属性
普通方法:
def printA(self,name):
print("======>",name)
def printA(self):
print("BBBBBBBB")
方式1:
test=Test()
test.printA("二哈") 报错
方式2:
test=Test()
test.printA() 不报错
覆盖的原则: 只要名字相同则就发生覆盖
静态方法
特点:
1.定义格式:
@staticmethod
def 方法名():
方法体
2.调用方式:
Person.static_method() ---> 通过类名访问
zhangsan=Person()
zhangsan.static_method() --->通过对象名调用
3.不能访问对象属性,可以通过类名.属性名的方式获取类属性
类方法
特点
1.格式:
@classmethod
def 方法名(cls):
方法体
2.类方法中不能访问实例属性(对象属性),对象方法
作用
只能访问类属性,而且类模型只要分配内存,类方法就存在. 就可以使用类方法做一些动作
特殊方法
__init__ : 完成对象的初始化信息,创建对象默认就调用此方法
1.子类中没有定义,则找父类的__init__
2.如果子类定义__init__,调用的就是自己 的
显式调用父类的__init__ 父类类名.__init__(参数列表)
__str__ : 打印print(对象名) ---> 在打印时看到的信息更加明确
__del__: 析构方法
1. 当空间引用计数为0的时候就会调用__del__ del 对象名
2. 自动调用__del__: 当py文件执行到最后的时候也会调用
注意:但是不建议大家自己定义__del__方法,就会破坏默认的垃圾回收机制
__call__:
特点:
1. 就是对象作为方法使用
2.__call__(self,添加其他的参数)
__new__:默认继承的是object
使用该方法创建当前实例对象,一般不重写,就算重写
也是调用父类的__new__方法,注意:一定要返回创建的对象
如果没有返回,__init__方法将不会被Python解释器调用
cls是类对象
封装
私有方法
就是在定义方法的时候,在方法名的前面"__"
外界无法访问私有属性,只有类自身可以访问__test
兄弟方法之间是可以相互访问的
私有属性
私有化: 只能在类中使用,归类私有
只要想将属性私有化则在属性前面添加两个下划线
只不过外界不能通过对象名.__属性名 但是如果想访问的话:_类名__属性名
set_xxx 设置值
get_xxx 获取值 有返回值
私有化属性,定义公有的set_xxx方法和get_xxx方法,供外界访问
私有方法:就是在定义方法的时候,在方法名的前面"__"
特点:外界无法访问私有方法,只有类自身可以访问self.__test()
继承
1. 代码复用
Animal 就是父类 基类 就会把子类中共同的代码,提取到父类中
子类继承父类:
1.格式:
class 子类(父类):
类体
2.能够继承父类中非私有属性和方法
3. 子类除了继承父类的内容,还可以定义自己的内容
4. 继承多个父类
class 子类(父类1,父类2,..):
拥有了多个父类的属性和方法(非私有)
继承允许多层继承
继承:
子类的继承父类,有多个父类,继承也可以多层继承
非私有属性和方法
同名属性
1. 对象属性:
默认子类使用的就是自己的
同名的话仍然想使用父类的
A.按照方法的调用方式是报错的
B.super().属性名 也是报错的
2. 类属性:
A. 父类.属性名 -
B. super 表示父类 super().属性名
C. super(子类名,子类对象).属性名
同名方法
1. 普通方法
2. __init__
子类的都会把父类的覆盖了,但是仍然可以使用父类,
A. 父类.方法名(参数列表) ---->必须要传递self
B. super 表示父类 super().父类方法() ---->参数中不用添加self (推荐)
C. super(子类名,子类对象).方法() ---->参数中不用添加self
多继承顺序
print(C.__mro__) # C3 查看父类的搜索顺序
print(inspect.getmro(C))
print(C.__bases__) # 获取当前C类直接父类
print(C.__base__) # 只能从左边向右边获取第一个父类 只能拿到一个
新式类
class 类名:
类体
默认继承object
父类: object
父类 :Person
子类: Student
1. 继承中如果有重名: 父类中有name属性,子类中也存在name属性,如果调用的话优先找子类本身的属性name
自身没有的话,继续会向上层父类中找
2. 同理方法也是如此
方法的重写:
发生在子类中,子类方法的名字与父类的同名,默认找就是子类自己的
新式类和经典类
1.经典类: type(实例对象)
<type 'instance'>
新式类 type(实例对象)
<class '__main__.类'>
2.经典类: __class__
__main__.B
新式类 __class__
<class '__main__.类'> 与type(实例名)相同的
3.经典类采用深度优先,新式类采用广度优先
4.新式类相同父类只执行一次构造函数,经典类重复执行多次
C是大写是类名
print(C.__mro__) # 适用于新式类
经典类
print(inspect.getmro(C))
类里面:
__init__
__str__
__del__
__call__
__new__
结合类使用:
对象.__class__ ---> 返回的对象的模型
类名.__mro__ ----> 搜索父类的顺序
类名.__bases__ --->查看当前类的直接父类
类名.__base__ --->只能看到一个父类(从左向右)
dir(): 查看类中的属性
多态能够使代码更加灵活