代码之家  ›  专栏  ›  技术社区  ›  user24751274

我可以引用另一个属性的f-string中的类属性吗

  •  0
  • user24751274  · 技术社区  · 1 年前

    新的和四处玩耍学习。

    我想使用一个属性作为另一个属性的补充和自动化

    class ShopItem:
        def __init__(self, name='<unnamed>', price=000.00, utility=0, description="<undefined>"):
            self.name = name
            self.price = price
            self.utility = utility
            self.description = description
    
    
    apple = ShopItem("Apple",
                     1.2,
                     2,
                     f"A delicious apple.\nRestores {self.utility} hp")
    

    最后一行

    想要 self.description 拥有 utility 在…内 print(apple.description) 要打印: “恢复2 hp”

    我试过:

    ...{utility}...

    ...{self.utility}...

    ...{apple.utility}...

    ...{ShopItem.utility}...

    IDE说

        ... line 12, in <module>
        f"A delicious apple.\nRestores {self.utility}")
                                        ^^^^
    NameError: name 'self' is not defined
    

    这个 not defined 更改为点之前的内容

    3 回复  |  直到 1 年前
        1
  •  1
  •   Steven Summers    1 年前

    不能使用f-string,因为在构造字符串时需要提供该值。您可以改为模板化字符串并使用 .format 替换中命名的值 {<property name>} .

    现在你可以采取一些方法。首先是通过 self 以及访问该值。

    class ShopItem:
        def __init__(self, name='<unnamed>', price=000.00, utility=0, description="<undefined>"):
            self.name = name
            self.price = price
            self.utility = utility
            self.description = description.format(self=self)
    
    apple = ShopItem("Apple",
                     1.2,
                     2,
                     "A delicious apple.\nRestores {self.utility} hp")
    
    print(apple.description)
    

    您可以使用的另一个选项是 vars(self) 获取实例的所有属性值,以及 ** 将它们作为关键字传递给 format .

    self.description = description.format(**vars(self))
    
    apple = ShopItem("Apple",
                     1.2,
                     2,
                     "A delicious apple.\nRestores {utility} hp")
    

    或者,你可以对你通过的内容更加挑剔 vars 获取所有内容,只指定要使用的属性,即使不是所有属性都在模板中设置

    apple = ShopItem("Apple",
                     1.2,
                     2,
                     "A delicious apple.\nRestores {utility} hp")
    
    self.description = description.format(price=price, utility=utility)
    

    请记住在中执行此操作 __init__ 意味着即使值发生变化,格式化的描述也不会发生变化

        2
  •  0
  •   Mark Tolonen    1 年前

    self 在使用时不为人所知,但由于您知道的价值 utility 将其设置为变量并使用 那个 :

    class ShopItem:
    
        def __init__(self, name='<unnamed>', price=000.00, utility=0, description='<undefined>'):
            self.name = name
            self.price = price
            self.utility = utility
            self.description = description
    
    utility = 2
    apple = ShopItem('Apple',
                     1.2,
                     utility,
                     f'A delicious apple.\nRestores {utility} hp')
    
    print(apple.description)
    

    输出

    A delicious apple.
    Restores 2 hp
    
        3
  •  0
  •   AME    1 年前

    如果不是强制使用fstring来解决问题,则可以使用 format

    class ShopItem:
        def __init__(
            self,
            name='<unnamed>',
            price=000.00,
            utility=0,
            description="<undefined>"
        ):
            self.name = name
            self.price = price
            self.utility = utility
            self.description = description.format(self.utility)
    
    
    apple = ShopItem(
        name="Apple",
        price=1.2,
        utility=2,
        description="A delicious apple.\nRestores {} hp"
    )
    
    print(apple.description)
    

    基本上,您使用的是占位符,并将在 __init__ 在的帮助下 format() .

    您提供的代码不起作用,因为 self 在这一点上不存在,甚至不存在 utility 的分配过程中可以使用的集合 description

    自己 是在执行之后创建的对象的实例 __初始化__ 。您正要创建实例,调用 ShopItem(name="Apple", price=1.2, utility=2, description="A delicious apple.\nRestores {} hp")