__new__方法 实例化过程会自动调用 在__init__方法前 提供实例框架
只能调用父类的
def __new__(cls, *args, **kwargs):
return super().__new__(cls, *args, **kwargs)
单例模式 常用软件设计模式: 确保一个类只有一个实例存在
# 创建单例对象
class DataBaseClass(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'_instance'): # 如果不存在则创建
cls._instance=super().__new__(cls,*args,**kwargs)
return cls._instance
pass
class BTopScore(DataBaseClass):
pass
db1=BTopScore() # 和db1=DataBaseClass() 结果一致
db2=BTopScore()
db3=BTopScore()
print(id(db1))
print(id(db2))
print(id(db3))
异常处理 try:except:
# 异常
try:
# 谁先出错就直接去捕获该错误
li=[1,2,5]
print(li[5])
print(b) # 要捕获的代码
pass
except IndexError as msg: # 序列索引超出时引发
print(msg) #捕获到错误才在这执行 不同错误类型
except NameError as msg: # 在全局找不到变量时引发
print(msg) #捕获到错误才在这执行
except Exception as result: # 万能错误异常捕捉所有的异常
print(result)
print('hello')
print('world')
try- except -else
try:
print("a")
except Exception as msg:
print(msg)
else:
print("当try里面的代码没有出现异常时 执行else里的语句")
try-except-finally
try:
int('ffff')
pass
except Exception as msg:
print(msg)
finally:
print("程序执行完都要执行finally语句")
raise 抛出异常 自定义异常
# 自定义异常
class LongString(Exception):
def __init__(self,long):
self.long=long
def __str__(self):
return "你输入的姓名长度是"+str(self.long)+'超出了'
def name_test():
name=input('请输入姓名:')
try:
if len(name)>5:
raise LongString(len(name)) #抛出自定义的异常
else:
print(name)
except LongString as result:
print(result)
finally:
print("程序执行完")
name_test()
动态添加属性 weight 实例属性和类属性
class Student:
def __init__(self,name,age):
self.name=name
self.age=age
pass
def __str__(self):
return '{}今天{}岁了'.format(self.name,self.age)
ws=Student('wangshan',22)
ws.weight=90 # 动态添加
print(ws)
print(ws.weight)
dxr=Student('dengxinrong',22)
print(dxr)
print(dxr.weight) # 错误
Student.school='成都理工大学' # 动态添加类属性
print(dxr.school)
动态绑定方法 实例方法才绑定库
import types # 动态添加方法的库
def dymicMethod(self):
print('{}的体重是:{},在{}读大学'.format(self.name,self.weight,Student.school))
Student.school='成都理工大学' # 动态添加类属性
ws=Student('wangshan',22)
ws.weight=90 # 动态添加
ws.printInfo=types.MethodType(dymicMethod,ws) # 动态的绑定方法
ws.printInfo() # 调用动态绑定方法
动态绑定类方法 静态方法类似 @staticmethod
@classmethod
def class_testMethod(self):
print('这是一个类方法')
pass
Student.classMethod=class_testMethod
Student.classMethod()
dxr.classMethod()
_slots- 限制属性变量
在继承关系中 子类未声明__slots时 属性不受其限制
当子类也声明__slots属性时 其限制范围为父类+自身的slots限制的属性
# __slots__变量 限制class实例能添加的属性
class Student2(object):
__slots__ = ('name',"age")
def __str__(self):
return "{}..{}".format(self.name,self.age)
xw=Student2()
xw.name='xiaowang'
xw.age=12
xw.score=99 # 'Student2' object has no attribute 'score' 不能添加
print(xw)
dict属性 查看可用属性
print(xw.__dict__) # 所有可用的属性都在这里 占用空间大
在定义slots变量后 student类实例不能在随意创建不在其中的属性了
同时实例中也不再有dict变量