'''
文件处理
read(3):
1 文件打开方式为文本模式时,代表读取3个字符
2 文件打开模式为b模式时,代表读取3个字节
f.tell() 指针位置为
文件指针移动
f.seek(offset,whence)
offset --开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为0 给offset参数一个定义,表示要从哪个位置开始偏移
0 代表从文件开头开始算起
1 代表从当前位置开始算起 b模式下
2 代表从文件末尾算起 b模式下
f.seek(0,2) 偏移量0 移动到文件尾位置
函数:函数就是实现某一功能的工具
函数的基本使用(原则:先定义,后调用)
定义阶段发生什么事:只检测语法,不执行代码
面向过程思想:
核心是‘过程’二字,过程指的是解决问题的步骤是,先干什么在干什么
基于该思想编写程序,相当于一条流水线,一种机械式的思维方式
面向对象思想:
核心是 对象 二字,对象指的是数据与方法的结合体。也就是容器
基于该思想编写程序,就好比创造世界,一种上帝式的思维方式。
面向对象
面向对象的核心就是对象二字,对象(对象就是容器,箱子)的精髓在于'整合'
1类与对象
对象是特征与技能的结合体,即数据与方法。 容器/名称空间
类则是一系列对象相似的特征与技能的结合体,即相似的数据与方法。 容器/名称空间
类的两种用途:
1 当容器去用
类的数据属性
类的函数属性
2 调用类的过程称之为实例化,结果就是对象
实例化时方式两件事:
1 先产生一个空对象
2 触发__init__(空对象,arg1,age2....)
面向对象三大特性
封装:
把一堆数据属性与方法方法属性 整合 到对象里面。
隐藏:
__属性----》把属性变形了,即隐藏起来了!
继承:
父类是一些类共有的数据属性与方法属性的结合体
子类可以继承父类的属性,还可以派生出自己独有的属性
组合:
1 即继承父类的属性,且不与父类耦合到一起
2 把一个对象作为另一个对象的属性
组合是继承的一种应用
多态:
1 抽象类
2 鸭子类型
对象的绑定方法
给对象用的,由对象来调用,会自动把对象本身当做第一个参数传给self
classmethod staticmethod(非绑定方法) property
property 装饰器 将被装饰的方法属性伪装成数据属性(像对象的name age sex之类的) 会自动加括号 然后内部代码是return出去返回值
然后外部调用的时候就和调用数据属性类似
2继承与派生
1 什么是继承
继承是一种新建类的方式,新建的类称之为子类/派生类,被继承类称之为父类/超类/基类
继承描述的是一种遗传的关系,特点:
1 子类可以遗传/重用父类的属性(减少代码冗余)
2 一个子类可以同时继承多个父类
3 在继承的背景下,类分为新式类与经典类
子类如何重用父类属性?
在继承背景下属性的查找顺序??
新式类 经典类
2 为何要用继承
解决类与类之间代码冗余的问题
3 如何继承
class Foo:
pass
class Bar(Foo):
x=1
obj=Bar()
4 在子类派生新方法中重用父类功能的两种方式:
方式一:指名道姓地访问某一个类的函数
特点:
1:与继承无关
2:没有自动传值的效果
方式二:super(自己的类名,self)会得到一个特殊的对象,该对象专门用来访问'父类'中的属性,完全参照mro列表
特点:
1 严格依赖继承,完全参照mro列表
2 有自动传值的效果
3 组合
1 什么是组合
组合指的是一个对象拥有某一个属性,该属性的值来自于另一个类的对象
class OldboyStudent:
pass
class OldboyTeacher:
pass
class Course:
pass
stu=OLdboyStudent()
tea=OLdboyTeacher()
obj=Course()
stu.attr=obj
tea.attr=obj
2 为何要用组合
解决类与类之间代码冗余的问题(例子是 教务系统管理员 与老师学生的初始化相同,老师与学生有选课功能)
4 多态
多态指的是同一种事物的多种形态
多态性:指的是可以在不用考虑具体类型前提下而直接使用对象
多态的精髓就是'统一' 二字
python 崇尚鸭子类型
5面向对象高级:
1 反射:
通过 字符串 来操作类与对象的属性
hasattr()
判断对象或者类的属性是否存在
getattr()
获取对象或类的属性
参数1:对象(类也对象,存有数据属性,方法属性)
参数2:‘属性名’
参数3: 默认值 不存在的时候不会异常
setattr()
设置对象或者类的属性
不存在则新建
delattr()
删除对象或类的属性
2类的内置方法
__init__(): 调用类的时候自动触发__init__。
__str__(): 在对象被打印时自动触发 可以自定义打印对象的内容(此方法内,必须return一个字符串类型的值)
__del__:在对象被删除时先自动触发该方法,可以用来回收对象以外其他相关资源,比如系统资源
'''
# 一 绑定方法:绑定给谁就应该由谁类调用,谁类调用就会将谁当做第一个参数传入
# 1绑定给对象的方法:类中定义的函数默认就是绑定给对象的
# 2绑定给类的方法:为类中定义的函数加上一个装饰器classmethod
# 二:非绑定方法:即不与类绑定,又不与对象绑定,意味着对象和类都可以调用,无论谁来调用都是一个普通的函数,没有自动传值的效果
# class Foo:
# def f1(self):
# print(self)
#
# @classmethod
# def f2(cls):
# print(cls)
#
# @staticmethod
# def f3(x,y):
# print('f3',x+y)
#
#
# obj=Foo()
# # print(obj.f1)
# # obj.f1()
#
# # print(Foo.f2)
# # Foo.f2()
# # print(obj.f2)
# # obj.f2()
#
# print(Foo.f3)
# print(obj.f3)
#
# Foo.f3(1,2)
# obj.f3(3,4)
# 应用
# import settings #导入settings下面的IP 和port
# class MySql:
# def __init__(self,ip,port):
# self.id=self.create_id()
# self.ip=ip
# self.port=port
#
# def tell_info(self):
# print('id:%s ip:%s port:%s'%(self.id,self.ip,self.port))
#
# @classmethod #提供额外的实例化方式,从配置文件中加载配置
# def from_conf(cls):
# return cls(settings.IP,settings.PORT)
#
# @staticmethod
# def create_id():
# import uuid
# return uuid.uuid4()
#
# # obj2=MySql('1.2.2.','3306')
# obj2=MySql.from_conf()
# # print(obj2.__dict__)
#
#
# obj2.tell_info()
class Bar:
pass
class Foo(Bar):
pass
print(issubclass(Foo,Bar)) #True 判断Foo是否是Bar的子类
obj=Foo()
print(isinstance(obj,Foo)) #True 判断obj是否是Foo的类型