回顾文件的操作
这种方式 和之前 的是一样的操作 好处是 不需要 手动去close了 其他的操作都一样
with open("1手动抛出异常.py",'rb') as file:
print(file.read().decode("UTF-8"))
一 对象属性和类属性
在对象 里 创建的属性 称为 对象属性
在类定义的时候 或者是通过类创建的属性 称为 类属性
区别:
- 对象创建的属性 只有当前对象有 其他对象 没有
- 在类里创建的属性 所有的对象 都会拥有该属性
- 当在对象里创建了一个 和类同名的属性时 在次调用会优先调用对象的属性
- 对象不能够删除类属性
例子:
class A:
name = "" #类属性
def setAge(self):
self.age = 18 #对象属性 因为通过当前的对象来创建的
a = A() #实例化 类A
a.name = "" #这个是对象属性 通过当前对象 a来创建的
#创建类属性
A.属性名 = 属性值
#删除类属性
del A.属性名
#删除对象属性
del a.属性名
二 对象方法和类方法
(1) 给对象绑定方法(只有当前对象拥有该方法)
a = A()
from types import MethodType #通过MethodType来绑定对象方法
a.speak = MethodType(speak,a)
(2) 给类绑定方法 (所有的对象都拥有该方法)
类名.属性名 = 函数名
#所有的对象 都会拥有该方法
三 __slots__ 限制对象属性的添加
#限制对象只能添加 这三个属性
__slots__ = ('name','age','sex')
四 私有属性或方法
(1) 私有属性
__private_attr:俩个下划线作为开头 ,声明该属性为私有属性 不能再类的外部调用或者直接访问 在类的内部调用 self.__private_attr
在类的外部的私有属性的访问:(特殊的访问 不建议 了解)
类名._类名__属性名
(2) 私有方法
__private_func():俩个下划线作为开头 ,声明该属性为私有属性 不能再类的外部调用或者直接访问 在类的内部调用 self.__private_func()
在类的外部的私有方法的访问:(特殊的访问 不建议 了解)
类名._类名__方法名
五 @property装饰器
使用:
在 获取私有属性的方法上 加 @property
在设置值的函数上面 @函数名.setter 为设置值 当你给当前的私有属性名赋值的时候 会自动调用该方法
class A:
__birth = ''
year = 2017
# 写一个 方法 传入现在的年份 来求你的年龄
@property
def birth(self):
return self.year - self.__birth
#写一个 传入 出生年份的方法
@birth.setter
def birth(self,year):
# self.__birth = year
try:
self.__birth = int(year)
except:
raise TypeError("请输入正确的年份")
a = A()
a.birth = 100 #设置值
print(a.birth)#获取值
如果没有这个装饰器的话 在类的外部去操作 私有属性 只能通过公有的方法 来调用 但是你操作的是属性 就变成了操作 方法 很明显 不符合操作的逻辑 那么 通过装饰器就可以改变这个问题 在类的外部调用和私有属性同名的方法时 就可以像调用正常的属性一样去调用 但是其实你调用的还是一个方法 不光改变了调用私有属性的操作 还给当前的属性 多了一层过滤的操作
六 单一继承
在 面向对象中(OOP) 当我们定义一个类class的时候 可以从某个现有的类去继承 新的类称为子类 被继承的类 称为父类 ,超类或者基类
所有的类 都会默认继承 超类 (OBJECT) 类
主体结构:
class 类名(父类类名):
pass
class A(object):
pass
七 多继承
一个子类继承多个父类
注意:
- 注意父类的顺序 如果在调用的时候 没有指定 调用 哪个父类的方法时 会自动从左面的类-右侧 依次搜索
- 当多个父类 没有重复的方法或者属性的时候 会全部继承
主体结构:
class C(A,B):
pass
八 父类的方法的调用
类名.方法名(self)
super().方法名() 默认调用最近的父类的方法
super(类名,self).方法名() 如果类名传入的是 当前子类的名 那么传不传都一样
如果继承了A,B俩个类
class C(B,A):
def one_speak(self):
#类名.方法名(self)
B.speak(self) #调用 B类里面的speak方法
def two_speak(self):
#super().speak() 就近来调用
super(C,self).speak() #和上面一样
print("我是新添加的代码")
def three_speak(self):
super(B,self).speak() #调用A类里面的speak方法
九 系统方法
(1) 构造方法
__init__([参数1[,参数2]])
说明:在实例化类的时候 自动调用 常用于类的初始化
(2) 析构方法
__del__
说明:在当前文件执行完毕 自动调用 常用于释放资源
也可以通过 del 去触发
(3) 运算符重载
__add__
说明:当对象在进行运算的时候 会被触发
class ADD:
def __init__(self,x,y):
self.x = x
self.y = y
#当 俩个对象 进行相加的运算的时候 会自动触发
def __add__(self,other):
print("调用我了")
return self.x+other.x
obj1 = ADD(1,2)
obj2 = ADD(1,2)
(4) __str__
说明:在打印当前对象会自动调用
(5) __getattr__
说明:当调用不存在属性时 会被触发
十 系统常用的属性
__doc__
类的说明
__name__
类的名称
__bases__
获取多个父类
__base__
获取父类
__dict__
获取当前类/对象的属性或者方法