马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
制作者(builder)模式属于创建型模式,制作者模式一样寻常有两种范例的应用
制作者模式中的简单版本
徐徐复杂的标题
假设如今必要创建一个用户对象,那么你会如许实当代码
- class User:
- def __init__(self, name):
- self.name = name
- user = User("jack")
复制代码 厥后你必要为这个用户对象引入其他的属性:生日、住址、身高、体重、爱好,差别的用户在创建时不乐意提供此中一些信息,于是你实现了下面的版本:
- class User:
- def __init__(self, name, age=None,birth_date=None,address=None,heigh=None,weight=None,hobby=None):
- self.name = name
- self.age = age
- self.birth_date = birth_date
- self.address = address
- self.heigh = heigh
- self.weight = weight
- self.hobby = hobby
- user = User("John", heigh=165,weight=58,hobby="reading")
复制代码 可以看到随着对象的属性越来越多,我们的构造函数的参数列表越来越长。这里由于使用了关键字参数的关系,以是标题并不显着,如果使用位置参数,那么使用者在使用时就必须记着参数的位置,乃至对于没有的属性必要放置None值:
- def __init__(self, name, age,birthday,address,heigh,weight,hobby):
- ...
- User("Lucy",17,None,None,68,None,None)
复制代码 固然这个标题也不是不能担当,让我们继续增长标题标复杂度,如果如今我们还必要对一些属性举行校验大概转化处置惩罚,那么你大概会这么修改代码:
- class User:
- def __init__(self, name, age=None,birth_date=None,address=None,heigh=None,weight=None,hobby=None):
- self.name = name
- self.age = age if isinstance(age,int) and age > 0 else None
- self.birth_date = birth_date
- self.address = address
- self.heigh = heigh if isinstance(heigh, int) else None
- self.weight = weight if isinstance(weight, int) else None
- self.hobby = self.set_hobby(hobby)
- def set_hobby(self, hobby):
- if isinstance(hobby, list):
- hobby = ",".join(hobby)
- return hobby
- user = User("John", heigh=165,weight=58,hobby=["reading","running"])
复制代码 在这个版本中,构造参数依然很多,但set_hobby的出现,让我们开始思索属性的添加为什么不接纳调用实例函数的方式设置?于是我们修改了整个 User 的实现
- class User:
- def __init__(self, name):
- self.name = name
- self.label = None
-
- def get_user_info(self):
- return self.__dict__
- def add_age(self,age:int):
- if age < 0:
- raise ValueError("Age should be > 0!!!")
- self.age = age
- def add_birthday(self,birthday):
- self.birthday = birthday
- def add_address(self,address:str):
- self.address = address
- def add_height(self,height:int):
- self.height = height
- def add_weight(self,weight:int):
- self.weight = weight
- def add_hobby(self, hobby):
- if isinstance(hobby, list):
- hobby = ",".join(hobby)
- self.hobby = hobby
- def main():
- user = User("John")
- user.add_height(
复制代码 |