在Python中使用类方法时,是否可以解构“self”?
我想清理我的代码,以便它使用更少的在Python中使用类方法时,是否可以解构“self”?,python,oop,Python,Oop,我想清理我的代码,以便它使用更少的self.attribute实例,并且更易于阅读 常规功能的示例: 等级车: 品牌=无 颜色=无 型号=无 定义初始(自我、颜色、品牌、型号): 自我品牌=品牌 self.color=颜色 self.model=model def打印车(自): 打印(f“这是{self.color}{self.brand}在{self.model}中制造的{self.color}{self.brand}” car\u a=car(颜色为红色,品牌为奥迪,车型为2001) 汽车
self.attribute
实例,并且更易于阅读
常规功能的示例:
等级车:
品牌=无
颜色=无
型号=无
定义初始(自我、颜色、品牌、型号):
自我品牌=品牌
self.color=颜色
self.model=model
def打印车(自):
打印(f“这是{self.color}{self.brand}在{self.model}中制造的{self.color}{self.brand}”
car\u a=car(颜色为红色,品牌为奥迪,车型为2001)
汽车印刷车
#产出:这是一辆2001年生产的红色奥迪
我想如何更改它:
我想解构print\u car
上的self
参数,这样它会更干净一些,但可以实现相同的功能。类似这样:
def打印车({颜色、品牌、型号}):
打印(f“这是{color}{brand}在{model}制造的{color}{brand}”
这可能吗?常见?这主要是更干净的代码,但可能不是一个好方法?您可以使用字典获取大多数实例的属性。这允许使用属性调用可调用项,例如使用**
-解包将它们用作关键字参数:
class Car:
def __init__(self, color=None, brand=None, model=None):
self.brand = brand
self.color = color
self.model = model
def print_car(self):
print(
"This is a {color} {brand} manufactured in {model}".format(
**vars(self) # get and unpack attributes to keyword arguments
))
这在方法中并不常见,尽管它确实有它的用途。类有许多与显式分解冲突的功能,最重要的是子类化和使属性不严格定义
但是,仅用于保存一组特定属性的类可以安全地解构。例如,直接支持将实例转换为和。这允许按名称或顺序解构属性
如果经常需要解构,可以使用decorators将其自动化。解构第一个参数的简单decorator如下所示:
def自毁(方法):
“”“标记一个方法以将``self``分解为其参数”“”
@包装(方法)
def包装(自身,**kwargs):
返回方法(**vars(self),**kwargs)
返回包装器
它可以像其他方法装饰器一样直接在类
定义中应用,例如classmethod
。然后该方法将每个属性作为单独的参数,而不是单个self
参数
等级车:
def _;初始(自我,颜色=无,品牌=无,型号=无):
自我品牌=品牌
self.color=颜色
self.model=model
@破坏
def打印车(颜色、品牌、型号):
印刷品(f“这是{color}{brand}在{model}制造的{color}{brand}”)
汽车(颜色为红色,品牌为奥迪,型号为2001)。打印汽车()
#这是2001年生产的红色奥迪
请注意,
destruct
是一个演示程序。例如,vars
不适用于使用\uuuuuuuuuuuuuuuuuuuuuuuuuu
的类–如果需要,可以使用一些回退或检查类的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu注释。\uuuuuuu
。此外,该方法不再支持位置参数–检查签名压缩参数可以做到这一点。这不会删除您正在询问的特定样板文件,但是attrs
库将大大缩短此类类:Python没有解构,只解压可重用文件。也许您正在寻找vars(self)
获取self
的属性?这将允许“这是一个{model}制造的{color}{brand}”。格式(**vars(self))
。是否可以使用f
字符串实现相同的代码,而无需在每个括号中引用self
3次?