面向对象三(异常、模块)

__new__方法

class A(object):
    def __init__(self):
        print("这是 init 方法")

    def __new__(cls):
        print("这是 new 方法")
        return object.__new__(cls)

A()

在这里插入图片描述

class Dog:
    def __init__(self):
        print('这是init方法')

    def __str__(self):
        return '这是str方法'

    def __del__(self):
        print('这是del方法')

    def __new__(cls, *args, **kwargs):
        print(id(cls))
        print('这是new方法')
        return object.__new__(cls)

print(id(Dog))
dog = Dog()
print(dog)

在这里插入图片描述

总结:

  1. __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供;
  2. __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例;
  3. __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值。

单例模式

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。

class Person:
    def __init__(self,name):
        self.name = name


    def __new__(cls, *args, **kwargs):
        if not hasattr(cls,'instance'):
            cls.instance = super().__new__(cls)
        return cls.instance

a = Person('kenny')
b = Person('peter')
print(id(a))
print(id(b))
print(getattr(a,'name'))
print(getattr(b,'name'))

在这里插入图片描述
总结
单例模式下,创建的实例对象指向同一片空间,后面创建的对象会覆盖前面创建的对象,而非单例模式每次实例化一个对象都会开辟一个空间地址,所以说单例模式节约了大量的内存空间。

创建单例是,如果只初始化一次该怎么做

# 实例化一个单例
class Person(object):
    __instance = None
    __init_flag = False

    def __new__(cls, age, name):
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance

    def __init__(self, age, name):
        if not self.__init_flag:
            self.age = age
            self.name = name
            Person.__init_flag = True


a = Person(18, "kenny")
b = Person(8, "peter")

print(id(a))
print(id(b))


print(a.age)
print(b.age)
print(a.name)
print(b.name)

在这里插入图片描述

工厂方法模式

当买车时,有很多种品牌可以选择,比如北京现代、别克、凯迪拉克、特斯拉等,那么此时该怎样进行设计呢?

# 定义一个基本的4S店类
class CarStore(object):

    #仅仅是定义了有这个方法,并没有实现,具体功能,这个需要在子类中实现
    def createCar(self, typeName):
        pass

    def order(self, typeName):
        # 让工厂根据类型,生产一辆汽车
        self.car = self.createCar(typeName)
        self.car.move()
        self.car.stop()

# 定义一个北京现代4S店类
class XiandaiCarStore(CarStore):

    def createCar(self, typeName):
        self.carFactory = CarFactory()
        return self.carFactory.createCar(typeName)


# 定义伊兰特车类
class YilanteCar(object):

    # 定义车的方法
    def move(self):
        print("---车在移动---")

    def stop(self):
        print("---停车---")

# 定义索纳塔车类
class SuonataCar(object):

    # 定义车的方法
    def move(self):
        print("---车在移动---")

    def stop(self):
        print("---停车---")

# 定义一个生产汽车的工厂,让其根据具体得订单生产车
class CarFactory(object):

    def createCar(self,typeName):
        self.typeName = typeName
        if self.typeName == "伊兰特":
            self.car = YilanteCar()
        elif self.typeName == "索纳塔":
            self.car = SuonataCar()

        return self.car

suonata = XiandaiCarStore()
suonata.order("索纳塔")

工厂方法模式的定义:

  1. 定义了一个创建对象的接口(可以理解为函数),但由子类决定要实例化的类是哪一个,工厂方法模式让类的实例化推迟到子类,抽象的CarStore提供了一个创建对象的方法createCar,也叫作工厂方法。
  2. 子类真正实现这个createCar方法创建出具体产品。
    创建者类不需要直到实际创建的产品是哪一个,选择了使用了哪个子类,自然也就决定了实际创建的产品是什么。

异常处理

当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"

import time
try:
    f = open('test.txt')
    try:
        while True:
            content = f.readline()
            if len(content) == 0:
                break
            time.sleep(2)
            print(content)
    except Exception as ret:
        #如果在读取文件的过程中,产生了异常,那么就会捕获到
        #比如 按下了 ctrl+c
        print(ret)
    finally:
        f.close()
        print('关闭文件')
except:
    print("没有这个文件")

抛出自定义异常

class ShortInputException(Exception):
    '''自定义的异常类'''
    def __init__(self, length, atleast):
        super().__init__()
        self.length = length
        self.atleast = atleast

def main():
    try:
        s = input('请输入: ')
        if len(s) < 3:
            # raise引发一个你定义的异常
            raise ShortInputException(len(s), 3)
    except ShortInputException as result:
        print('ShortInputException: 输入的长度是 %d,长度至少应是 %d'% (result.length, result.atleast))
    else:
        print('没有异常发生.')

main()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值