Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用类方法时,是否可以解构“self”?_Python_Oop - Fatal编程技术网

在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次?