【问题标题】:Get variable name from argument/parameter in class function从类函数中的参数/参数中获取变量名
【发布时间】:2018-05-23 06:49:35
【问题描述】:

我尝试获取传递给函数的变量的名称。

class A():
  def __init__(self):
    self.a = 1

class B():
  def __init__(self):
    self.b = A()
    self.c = A()

  def doSomething(self, hello):
    print(hello)

B().doSomething(B().b)
<__main__.A object at 0x7f67571a3d68>

我想要的是我可以在函数 B().doSomething() 中确定变量是 b。这可能吗?一个限制是在函数 B().doSomething() 中只传递 B 的实例变量。

例如,在 peewee (https://github.com/coleifer/peewee) 中,python 中的 MySQL ORM,他们构建表达式用于过滤,例如:

B.select().where(B.b == True)

不知何故,他们能够识别出 b 已通过。因为否则无法正确构建查询。

我知道他们在类中使用静态变量,这可能是诀窍吗?

感谢您的帮助! :)

【问题讨论】:

  • 问题没有意义。您是否要确定hello == 'b' 是否存在?或者您是否试图确定实际的变量名称?还是您想确定self.b == hello
  • 我尝试获取实际的变量名。例如,我也可以通过 B().c 。那我就知道c通过了。

标签: python class variables static instance


【解决方案1】:

通过您的 B().doSomething(B().b) 示例调用,我假设您正在尝试确定变量 hello 是否等同于在 class B 对象上声明的变量 b

在这种情况下,您只需调用self 引用即可。 self 指的是您正在使用的对象的实例,并且在类中定义的每个方法都会自动引用对象的 self 作为方法属性。

因此,要确定对象b 变量是否等于hello 参数,您需要做的就是if self.b == hello: #do code

【讨论】:

  • 如果我比较self.b == hello,那么如果我通过B().doSomething(B().c) 可能会得到错误的变量名。因为B().b B().c是同一个类。
  • 不,因为B().b != B().c 因为它们可能是同一个类,但它们是不同的实例。因此,它们不会是等效的,您可以在技术上执行if...else 语句来确定通过了哪一个。我真的不明白你为什么需要这样做。
  • 因为如果我对数据库进行查询,我必须知道用户传递的是 B().b 还是 B().c,例如在 B().b 中我存储了价格房子和 B().c 我存储了房主的电话号码。如果我不能这样区分,那么我就无法正确地为数据库构建表达式。你能给我一个代码sn-p,它有效吗?我试过if self.b == hello:,但它不起作用。也许是因为通过赋值传递的参数? link
【解决方案2】:

B().b不是B的实例变量;相反,它是A 的实例变量。在B 的构造函数中,您可能意味着self.aB 的一个实例,或者self.aB 的一个实例。如果这是您的一般想法,您可以实现一个布尔重载方法来区分两者。对于您的代码,最好创建第三个类C,以检查传递给doSomething 的属性属于哪个类:

class A():
   def __init__(self):
     self.a = 1
   def __bool__(self):
        return True

class B():
   def __init__(self):
     self.b = 1
   def __bool__(self):
     return False


class C():
   def __init__(self):
       self.a = A()
       self.b = B()
   def doSomething(self, hello):
       if not hello:
           print("instance of a got passed")
       else:
          print("instance of b got passed")

C().doSomething(C().b)

输出:

instance of b got passed

【讨论】:

  • 很遗憾没有,例如,如果我有一个带有 self.a = IntegerField() 和 self.b = IntegerField() 的数据库,我会使用两次相同的类。
猜你喜欢
  • 2021-04-08
  • 2019-10-03
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
相关资源
最近更新 更多