Python 如何将字符串传递到类中,并在类中计算格式化变量

Python 如何将字符串传递到类中,并在类中计算格式化变量,python,Python,我只希望在doSomethingVeryComplex为类提供了它所需的数据之后对消息进行评估。我的目标是将消息传递到使用自己的实例变量的类中。然而,很明显,在这种情况下,我可以只做fHello{instance.name}然而,在我的情况下,这是不可能的,因为我不知道数据何时会被放入self。我需要我的类能够在获得数据后立即完全处理消息的构造。因此,用户可以输入带有占位符的变量,然后一旦接收到数据并将其放入自身,就可以根据用户输入的内容对其进行评估。可能有一种更优雅的方法,但这里有一种方法:

我只希望在doSomethingVeryComplex为类提供了它所需的数据之后对消息进行评估。我的目标是将消息传递到使用自己的实例变量的类中。然而,很明显,在这种情况下,我可以只做fHello{instance.name}然而,在我的情况下,这是不可能的,因为我不知道数据何时会被放入self。我需要我的类能够在获得数据后立即完全处理消息的构造。因此,用户可以输入带有占位符的变量,然后一旦接收到数据并将其放入自身,就可以根据用户输入的内容对其进行评估。

可能有一种更优雅的方法,但这里有一种方法:

class myClass():
  def __init__(self, name, age, username):
      self.name = name
      self.username = username
      self.age = age
      self.result = None

  def post(self, message):
        self.data = doSomethingVeryComplex()
        print(message) 

instance = myClass("Robstersgaming", "50", "Rob")
myClass.post(f"Hello {self.name} nice name!!! {self.age}, {self.username}, {self.data}") 
然后,print函数将局部变量字典传递给str.format_map,以将局部变量替换为最终字符串


这并不是很好,因为您需要知道对象的内部属性以及post方法的自参数的名称,而post方法根本不需要自参数。

我认为您需要的是普通字符串,而不是f字符串。如果对字符串调用format并将适当的值作为关键字参数传递,则可以将名称放在花括号中:

  def post(self, message):
        print(message.format_map(locals()))

instance.post("Hello {self.name} nice name!!! {self.age}, {self.username}")

如果类的所有属性都是格式设置的有效目标,则可以使用message.format**self.\uu dict\uuuu调用格式设置以自动包含所有属性。如果格式字符串不使用每个属性,则str将忽略未使用的关键字参数。format

这是一种非常灵活的方法来执行您想要的操作。我承认这是@BlckKnght的优秀答案的延伸。这个答案更进一步,将所有可以扩展为字符串的潜在值放在一个dict中。通过这样做,您可以在一个dict中收集一大堆内容,您的用户可以选择他们想要使用的值。您不必为每种情况决定要为特定情况传递到format语句中的值

请注意,在这里,我在dict中添加了日期和时间,但在示例中,我使用的是时间,而不是日期。您可以在dict中放入100个项目,对用户或您来说,格式化单个字符串并不困难。这就是这种方法的优点。您只需构建一次dict,然后将其传递到格式字符串中,而不必每次都列出用户可能希望在字符串中使用的所有单个变量

请注意,除了向dict提供可重用的值外,还可以传入特定于正在格式化的特定字符串的值。就像这里一样,您将数据作为唯一变量传递给一个示例格式调用

这是您的代码,已展开以演示:

class myClass():
    def __init__(self, name, age, username):
        self.name = name
        self.username = username
        self.age = age

    def post(self, message):
        print(message.format(name=self.name, age=self.age, username=self.username) 

instance = myClass("Robstersgaming", "50", "Rob")
instance.post("Hello {name} nice name!!! {age}, {username}")
结果:

from datetime import datetime

def doSomethingVeryComplex():
    return "A Complex Result"

class MyClass:

  def __init__(self, name, age, username):
      self.vars = {
          'name': name,
          'age': age,
          'username': username,
          'date': datetime.today().strftime("%d/%m/%Y"),
          'time': datetime.today().strftime("%H:%M:%S"),
      }
      self.data = None
      self.result = None

  def post(self, message):
        self.data = doSomethingVeryComplex()
        print(message.format(**self.vars, data = self.data))

instance = MyClass("Robstersgaming", "50", "Rob")
instance.post("Hello {name} nice name!!! The time is: {time} - {age}, {username}, {data}")

不清楚你在问什么。为什么不打印fHello{self.name}好名字!!!{self.age},{self.username}来自post方法本身?这样就为类的所有实例定义了它,而您所需要做的就是调用post来获取该消息?您是否考虑了不同的用例?你能举一些例子说明你打算如何使用这个post方法吗?这能回答你的问题吗@blorgon的原因是我希望消息是可变的,但可以访问实例变量。这个例子在显示问题lol方面很糟糕,我将修复它,但我需要它,这样我就可以传递带有post可以访问的任何可用实例变量的任何消息,并且只有在调用post时才对它们进行计算。所以我可以做instancemessage=我的名字是{self.name},然后再做instancemessage=我的年龄是{self.age},并在同一个类和method@CryptoFool如果是命名占位符,那么是.format,然后是no,因为我需要哪些变量,它们出现的顺序,等,由来电者决定。因此instance1message=我的名字是{self.name}instance2message=我的年龄是{self.age}就像这样,在我的类中,我可以用不同的变量和不同的消息更改消息。除非我误解了…@Blckknght:是的,当然!谢谢。使用带有格式映射的局部变量的另一种方法可能是使用常规格式并传递self=self作为参数。@Blckknght:是的,另一个好建议。总的来说,我认为在格式字符串中要求self是不可取的,而您的答案是更好的解决方案。使用self或其他名称的好处是,您不需要在关键字中使用self,因为格式字符串可以查找真正属于属性描述符的属性,并且只有在需要时才懒散地查找。我提供的两种方法要么是,如果使用foo=self.foo显式传递所有值(即使格式字符串中没有{foo}也会急切地查找foo属性),要么就是根本无法使用**self.\uuu dict\uuuuo使用属性。
Hello Robstersgaming nice name!!! The time is: 21:44:42 - 50, Rob, A Complex Result