【问题标题】:getting a dictionary of class variables and values获取类变量和值的字典
【发布时间】:2014-02-14 19:57:32
【问题描述】:

我正在研究一种将所有类变量作为键和值作为字典的值返回的方法,例如我有:

first.py

class A:
    a = 3
    b = 5
    c = 6

然后在 second.py 中,我应该能够调用一个方法或返回这样一个字典的东西

import first

dict = first.return_class_variables()
dict

那么 dict 会是这样的:

{'a' : 3, 'b' : 5, 'c' : 6}

这只是解释这个想法的一个场景,当然我不希望它那么容易,但是如果有关于如何处理这个问题的想法,就像 dict可用于设置类变量值,方法是将变量、值组合作为键、值的字典传递给它。

【问题讨论】:

  • 不清楚你在问什么,你所说的“类变量”是什么意思?
  • 类属性,下面的答案就是我要找的。:)
  • k,请记住,它还将包含类的方法,并且不会为您提供在父类中定义的任何属性。
  • 是的,我正在处理的类只包含属性没有方法,谢谢,我会记住这一点

标签: python class dictionary class-variables


【解决方案1】:

你需要过滤掉函数和内置的类属性。

>>> class A:
...     a = 3
...     b = 5
...     c = 6
... 
>>> {key:value for key, value in A.__dict__.items() if not key.startswith('__') and not callable(key)}
{'a': 3, 'c': 6, 'b': 5}

【讨论】:

  • 小修正:我认为应该是...and not callable(value)}.
【解决方案2】:

这样的?

  class A(object):
      def __init__(self):
          self.a = 3
          self.b = 5
          self.c = 6

  def return_class_variables(A):
      return(A.__dict__)


  if __name__ == "__main__":
      a = A()
      print(return_class_variables(a))

给了

{'a': 3, 'c': 6, 'b': 5}

【讨论】:

  • 我建议重命名该类...以增加关于 return_class_variables() 方法的清晰度。
  • 您正在设置和返回实例变量,而不是类变量。类变量不在__init__() 中定义,而是在class 语句之后定义。类变量对所有实例都是通用的,而实例变量只属于实例(Class 对象不能访问实例变量,尽管相反是可能的)。
【解决方案3】:

A.__dict__ 使用字典推导并过滤掉以__ 开头和结尾的键:

>>> class A:
        a = 3
        b = 5
        c = 6
...     
>>> {k:v for k, v in A.__dict__.items() if not (k.startswith('__')
                                                             and k.endswith('__'))}
{'a': 3, 'c': 6, 'b': 5}

【讨论】:

    【解决方案4】:

    最好的解决方案和最pythonic是使用var(class_object)var(self)(如果尝试在类内使用)。

    这虽然确实避免了键是另一个对象而不是默认 python 类型的字典对。

    >>> class TheClass():
    >>>    def __init__(self):
    >>>        self.a = 2
    >>>        self.b = 1
    >>>        print(vars(self))
    >>> class_object= TheClass()
    {'a'=2, 'b'=1}
    
    

    或课外

    >>> vars(class_object)
    {'a': 2, 'b': 1}
    

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多