gpt4 book ai didi

python - Python中有一个简写的初始化程序吗?

转载 作者:太空狗 更新时间:2023-10-30 01:56:47 34 4
gpt4 key购买 nike

我没有找到简短的构造函数调用的引用,该调用将初始化调用者选择的变量。我在寻找

class AClass:
def __init__(self):
pass

instance = AClass(var1=3, var2=5)

而不是写更重
class AClass:
def __init__(self, var1, var2):
self.var1 = var1
self.var2 = var2

或更重
instance = AClass()
instance.var1 = 3
instance.var2 = 5

我想念什么吗?

最佳答案

这是一个很好的问题,对我来说也是一个难题。
在现代的Python世界中,根据您的需要,有三个(优秀的)速记初始值设置项(这个术语很聪明,我正在采用)。 无需任何操作,就可以使用__init__方法(这是您首先要避免的方法)。
命名空间对象
如果您希望为实例分配任意值(即不是由类强制执行),则应使用称为命名空间的特定数据结构。命名空间对象是可以使用点表示法访问的对象,基本上可以将所需的对象分配给该对象。
您可以从argparse导入Namespace类(在此介绍:How do I create a Python namespace (argparse.parse_args value)?)。从Python 3.3开始。标准类型包中提供了SimpleNamespace类。

from types import SimpleNamespace
instance = SimpleNamespace(var1=var1, var2=var2)
您还可以编写:
instance = SimpleNamespace()
instance.var1 = var1
instance.var2 = var2
假设它是“快速而肮脏的方式”,在许多情况下都可以使用。通常,甚至不需要声明您的类。
如果您希望实例仍然具有一些方法和属性,则仍然可以执行以下操作:
class AClass(Namespace):
def mymethod(self, ...):
pass
然后:
instance = AClass(var1=var1, var2=var2, etc.)
这为您提供最大的灵活性。
命名元组
另一方面,如果您希望类 强制这些属性,那么您还有另一个更可靠的选择。
名为tuple 的 会生成不可变的实例,这些实例将被彻底初始化。可以将它们视为普通的元组,但每个项目也都可以使用点符号来访问。此类namedtuple是Python标准发行版的一部分。这是您生成类的方式:
from collections import namedtuple
AClass = namedtuple("AClass", "var1 var2")
请注意定义是多么的酷和简短,而不需要__init__方法。您实际上可以在那之后完成类(class)。
并创建一个对象:
instance = AClass(var1, var2)
或者
instance = AClass(var1=var1, var2=var2)
命名列表
但是,如果您希望该实例是可变的,即允许您更新该实例的属性,该怎么办?答案是名为列表
(也称为RecordClass)。从概念上讲,它就像一个普通列表,其中的项目也可以使用点标记来访问。
有各种实现。我个人使用了恰本地命名为namedlist
语法是相同的:
from namedlist import namedlist
AClass = namedlist("AClass", "var1 var2")
并创建一个对象:
instance = AClass(var1, var2)
或者:
instance = AClass(var1=var1, var2=var2)
然后您可以修改它们:
instance.var1 = var3
但是您不能添加未定义的属性。
>>> instance.var4 = var4
File "<stdin>", line 1, in <module>
AttributeError: 'instance' object has no attribute 'var4'
用法
这是我的两位:
  • 命名空间对象具有最大的灵活性,甚至不需要声明类。可能会出现无法正常运行的实例的风险(但Python是成年人同意的一种语言)。如果您只有一个实例和/或您知道自己在做什么,那将是您的最佳选择。
  • namedtuple 类生成器非常适合生成用于函数返回的对象(请参阅Raymond Hettinger的演讲中的brief explanation)。而不是返回用户需要在文档中查找的平淡的元组,返回的元组是不言自明的(目录或帮助会做到这一点)。而且它仍然与元组用法兼容(例如k,v, z = my_func())。加上它是一成不变的,它有自己的优势。
  • 命名列表类生成器在很多情况下都非常有用,包括当您需要从函数返回多个值时,然后需要在以后的阶段对其进行修改(并且仍然可以解压缩它们:k, v, z = instance)。如果您需要来自具有强制属性的适当类的可变对象,则可能是首选的解决方案。

  • 如果使用得当,则可能会大大减少编写类和处理实例所花费的时间!

    更新(2020年9月)
    @PPC:您的梦想成真。
    从Python 3.7开始,有一个新工具作为标准提供:数据类(不出所料,命名列表包的设计者Eric V. Smith也位于其后)。
    本质上,它提供了类变量的自动初始化。
    from dataclasses import dataclass

    @dataclass
    class InventoryItem:
    """Class for keeping track of an item in inventory."""
    name: str
    unit_price: float
    quantity_on_hand: int = 0

    def total_cost(self) -> float:
    return self.unit_price * self.quantity_on_hand
    (来自官方文档)@dataclass装饰器将执行的操作是自动添加__init__()方法:
    def __init__(self, name: str, unit_price: float, quantity_on_hand: int=0):
    self.name = name
    self.unit_price = unit_price
    self.quantity_on_hand = quantity_on_hand
    恕我直言,这是一个非常漂亮的Python解决方案。
    Eric还在github上为Python 3.6维护了一个backport of dataclasses

    关于python - Python中有一个简写的初始化程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48285048/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com