美文网首页简友广场想法散文
python工厂模式和异常处理

python工厂模式和异常处理

作者: Cache_wood | 来源:发表于2021-10-30 13:09 被阅读0次

工厂模式

两个类A和B之间的关系应该仅仅是A创建B或 是A使用B,而不能两种关系都有

将对象的创建和使用分离,也使得系统更加符合“单一职责原则”,有利于对功能的复用和系统的维护

防止用来实例化一个类的数据和代码在多个类中到处都是

'''
除下实现方式外,还对以对工厂进一步进行抽象,得到抽象工厂,使得进一步解耦,
不再通过参数来得到要生产的类的对象。
'''
class Fruit:
    pass

class Apple(Fruit):
    pass
    def pie(self):
        print("making apple pie")

class Orange(Fruit):
    pass

    def juice(self):
        print("making orange juice")

class FruitFactory:

    def generate_fruit(self,type):
        if type=='a':
            return Apple() #可以根据apple的定义进行初始化
        elif type=='o':
            return Orange()#可以根据orange的定义进行初始化
        else:
            return None

ff=FruitFactory()
apple=ff.generate_fruit('a')
orange=ff.generate_fruit('o')
apple.pie()
orange.juice()

#“抽象”工厂的简要实现

class Factory:

    def generate(self):
        pass

class AppleFactory(Factory):

    def generate(self):
        return Apple()#

class OrangeFactory(Factory):
    
    def generate(self):
        return Orange()

异常处理

  • 异常捕获
try:
    <statements>
except;
    <statements>

执行try子句,无异常发生时except子句被忽略。

包含多个except子句时最多只有一个分支会被执行。

class AccoutError(Exception):
    def __init__(self,user):
        self.user=user

class AccountNegativeDepositError(AccoutError):
    def __init__(self,user,m):
        self.user=user
        self.m=m
        self.message="{} deposit negative amount: {}".format(user,m)

class AccountBalanceNotEnoughError(AccoutError):

    def __init__(self,user,balance, m):
        self.user=user
        self.m=m
        self.balance=balance
        self.message="{}'s balance {} is smaller than the withdraw amount of {}. Loan is suggested.".format(user,balance,m) 

class Account:

    def __init__(self,user,balance):
        self._user=user
        self._balance=balance

    def set_balance(self,balance):
        self._balance=balance

    def get_balance(self):
        return self._balance

    def get_user(self):
        return self._user

    def deposit(self,m):
        if m<0:
            raise AccountNegativeDepositError(self.get_user(),m)
        else:
            self.set_balance(self.get_balance()+m)

    def withdraw(self,m):
        if self.get_balance()<m:
            raise AccountBalanceNotEnoughError(self.get_user(),self.get_balance(),m)
        else:
            self.set_balance(self.get_balance()-m)

account=Account('zjc',100)
try:
    #account.deposit(-100)
    account.withdraw(10000)
except AccountNegativeDepositError as ande:
    print(ande.message)
except AccountBalanceNotEnoughError as abnee:
    print(abnee.message)
except AccoutError:
    print('noname exception')
else:
    print('no except...')
    print(account.get_balance())
  • 定义清理行为
    无论try子句有无发生异常,finally子句都会执行
try:
    result = x/y
except ZeroDivisionError:
    print("division by zero!")
else:
    print("result is",result)
finally:
    print("executing finally clause")
  • return语句的位置
    不要在try, except, else子句里写返回值。
    尤其是有else子句时,try中的return会导致else不执行
    如果finally有返回值,其将会覆盖原始的返回值

  • 断言
    用于判断一个表达式,并在表达式False的时候触发异常

#assert expression

if not expression:
    raise AssertionError
#assert expression [,arguments]
if not expression:
    raise AssertionError(arguments)

相关文章

网友评论

    本文标题:python工厂模式和异常处理

    本文链接:https://www.haomeiwen.com/subject/dmygaltx.html