python面向对象的终结,单例模式多例模式创建对象模式方法,异常处理动态绑定属性,限制属性

__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变量
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值