【问题标题】:Is there a built-in function to print all the current properties and values of an object?是否有一个内置函数可以打印对象的所有当前属性和值?
【发布时间】:2010-09-16 13:36:04
【问题描述】:

所以我在这里寻找的是类似于 PHP 的 print_r 函数。

这样我就可以通过查看相关对象的状态来调试我的脚本。

【问题讨论】:

  • 在@Aaron_Hall 的回答中查看此处描述的各种方法如何适用于您的情况
  • 您要求的是属性,不是吗?这个问题具有误导性,因为 property 在 Python 中具有与 attribute 的含义不同的特定含义。如果我是对的,也许你想改写你的问题?
  • 我会接受大约 50% 更多赞成票的答案。
  • @WinEunuuchs2Unix 接受的答案更好。它表明 pprint 不是必需的,只是一个不错的选择,它显示了所有方式,而不仅仅是一个。

标签: python debugging introspection pretty-print python-datamodel


【解决方案1】:

您可以使用“dir()”函数来执行此操作。

>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__', '__stdin__', '__stdo
t__', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder
, 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'exc_clear', 'exc_info'
 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getcheckinterval', 'getdefault
ncoding', 'getfilesystemencoding', 'getrecursionlimit', 'getrefcount', 'getwindowsversion', 'he
version', 'maxint', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_
ache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit
, 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoption
', 'winver']
>>>

另一个有用的功能是帮助。

>>> help(sys)
Help on built-in module sys:

NAME
    sys

FILE
    (built-in)

MODULE DOCS
    http://www.python.org/doc/current/lib/module-sys.html

DESCRIPTION
    This module provides access to some objects used or maintained by the
    interpreter and to functions that interact strongly with the interpreter.

    Dynamic objects:

    argv -- command line arguments; argv[0] is the script pathname if known

【讨论】:

    【解决方案2】:
    def dump(obj):
      for attr in dir(obj):
        print("obj.%s = %r" % (attr, getattr(obj, attr)))
    

    有许多第三方函数可以根据作者的喜好添加异常处理、国家/特殊字符打印、递归到嵌套对象等内容。但他们基本上都归结为这一点。

    【讨论】:

    • unpythonic,因为这里没有发明
    • 说什么?当然,您可以在标准 inspect 模块中使用 getmembers() 函数,但我认为这会更有用,因为它说明了如何进行一般的内省。
    • 一点也不。 dir(obj) 显示在__dict__ 中找不到的属性(例如__doc____module__)。此外,__dict__ 根本不适用于使用__slots__ 声明的对象。通常,__dict__ 显示了实际存储在内部字典中的用户级属性。 dir() 显示更多。
    • 某些类/对象不包含任何__dict__ 属性/成员。我知道这很疯狂,但这是真的。 intstrre.MatchObjects 等内置函数是常见示例。试试'hello'.__dict__,然后试试dir('hello')
    • 我不在乎那是«unpythonic»还是什么。它完成了工作,这在调试中是唯一重要的事情。
    【解决方案3】:

    dir 已经提到过,但这只会给你属性的名称。如果您也想要它们的值,请尝试 __dict__。

    class O:
       def __init__ (self):
          self.value = 3
    
    o = O()
    

    这是输出:

    >>> o.__dict__
    
    {'value': 3}
    

    【讨论】:

    • set 这样的对象没有__dict__,所以对他们来说,AttributeError: 'set' object has no attribute '__dict__' 会失败
    【解决方案4】:

    你真的把两种不同的东西混在一起了。

    使用dir()vars()inspect 模块来获取您感兴趣的内容(我以__builtins__ 为例;您可以使用任何对象代替)。

    >>> l = dir(__builtins__)
    >>> d = __builtins__.__dict__
    

    随心所欲地打印该词典:

    >>> print l
    ['ArithmeticError', 'AssertionError', 'AttributeError',...
    

    >>> from pprint import pprint
    >>> pprint(l)
    ['ArithmeticError',
     'AssertionError',
     'AttributeError',
     'BaseException',
     'DeprecationWarning',
    ...
    
    >>> pprint(d, indent=2)
    { 'ArithmeticError': <type 'exceptions.ArithmeticError'>,
      'AssertionError': <type 'exceptions.AssertionError'>,
      'AttributeError': <type 'exceptions.AttributeError'>,
    ...
      '_': [ 'ArithmeticError',
             'AssertionError',
             'AttributeError',
             'BaseException',
             'DeprecationWarning',
    ...
    

    在交互式调试器中也可以通过命令进行漂亮的打印:

    (Pdb) pp vars()
    {'__builtins__': {'ArithmeticError': <type 'exceptions.ArithmeticError'>,
                      'AssertionError': <type 'exceptions.AssertionError'>,
                      'AttributeError': <type 'exceptions.AttributeError'>,
                      'BaseException': <type 'exceptions.BaseException'>,
                      'BufferError': <type 'exceptions.BufferError'>,
                      ...
                      'zip': <built-in function zip>},
     '__file__': 'pass.py',
     '__name__': '__main__'}
    

    【讨论】:

    • 令人惊讶的是,似乎并非所有对象都有__dict__ 成员(例如re.MatchObject),但内置dir() 适用于所有对象。
    • print re.compile(r'slots').search('No slots here either.').__slots__
    • 对我来说是新的。谢谢。这个点触发了我大脑的模块路径解析器。甚至从未考虑过拉丁语“模块”。
    • 你为什么不在你的回答中多谈谈inspect模块?我认为它是最接近 print_r 或 var_dump 的东西。
    • 那么如何访问dir() 列出的属性后面的值呢? dir() 仅返回名称列表,并非所有名称都存在于vars()__dict__ 属性中。
    【解决方案5】:

    您希望vars()pprint() 混合:

    from pprint import pprint
    pprint(vars(your_object))
    

    【讨论】:

    • vars() 只是返回其参数的__dict__,这也是dir() 的后备,以防没有__dir__ 方法。所以首先使用dir(),就像我说的那样。
    • @hop: dir() 为您提供了您可能不关心的所有内置内容,例如 __str____new__var() 没有。
    • 这在没有 __dict__ 属性的集合和其他对象上失败。
    • 这绝对是个好答案,添加更多:from inspect import getmembers
    • @hop, vars() 给出了字段的值,而dir() 给它们留下了一个谜。
    【解决方案6】:

    要打印对象的当前状态,您可以:

    >>> obj # in an interpreter
    

    print repr(obj) # in a script
    

    print obj
    

    为您的类定义__str____repr__ 方法。来自Python documentation

    __repr__(self)repr() 内置函数和字符串调用 转换(反引号)到 计算“官方”字符串 对象的表示。如果有的话 可能,这应该看起来像 可能是有效的 Python 表达式 用于重新创建一个对象 相同的值(给定一个适当的 环境)。如果这是不可能的, 形式为“<...>”应该返回。 返回值必须是字符串 目的。如果一个类定义了 repr() 但不是__str__(),那么__repr__() 是 也用于“非正式”字符串 该实例的表示 类是必需的。这通常是 用于调试,所以很重要 表示是 信息丰富且明确。

    __str__(self)str() 内置函数和打印调用 计算“非正式”的声明 对象的字符串表示。 这与__repr__() 的不同之处在于 它不必是有效的 Python 表达式:更方便的或 可以使用简洁的表示 反而。返回值必须是 字符串对象。

    【讨论】:

    • 此选项对于打印与对象内容连接的字符串很有用:print "DEBUG: object value: " + repr(obj)
    【解决方案7】:

    元编程示例Dump object with magic

    $猫转储.py
    #!/usr/bin/python
    import sys
    if len(sys.argv) > 2:
        module, metaklass  = sys.argv[1:3]
        m = __import__(module, globals(), locals(), [metaklass])
        __metaclass__ = getattr(m, metaklass)
    
    class Data:
        def __init__(self):
            self.num = 38
            self.lst = ['a','b','c']
            self.str = 'spam'
        dumps   = lambda self: repr(self)
        __str__ = lambda self: self.dumps()
    
    data = Data()
    print data
    

    没有参数:

    $蟒蛇转储.py
    <__main__.Data instance at 0x00A052D8>
    

    Gnosis Utils:

    $ python dump.py gnosis.magic MetaXMLPickler
    <?xml version="1.0"?>
    <!DOCTYPE PyObject SYSTEM "PyObjects.dtd">
    <PyObject module="__main__" class="Data" id="11038416">
    <attr name="lst" type="list" id="11196136" >
      <item type="string" value="a" />
      <item type="string" value="b" />
      <item type="string" value="c" />
    </attr>
    <attr name="num" type="numeric" value="38" />
    <attr name="str" type="string" value="spam" />
    </PyObject>
    

    它有点过时但仍然有效。

    【讨论】:

      【解决方案8】:

      在大多数情况下,使用 __dict__dir() 会为您提供所需的信息。如果您碰巧需要更多细节,标准库包含inspect 模块,它可以让您获得一些令人印象深刻的细节。一些真正的信息要点包括:

      • 函数和方法参数的名称
      • 类层次结构
      • 函数/类对象的实现源代码
      • 框架对象外的局部变量

      如果您只是在寻找“我的对象具有哪些属性值?”,那么dir()__dict__ 可能就足够了。如果您真的想深入了解任意对象的当前状态(请记住,在 python 中几乎所有事物都是对象),那么 inspect 值得考虑。

      【讨论】:

      • 使用您对检查的解释来改进最完整的答案。希望你没事。
      【解决方案9】:

      pprint 包含一个“漂亮的打印机”,用于生成美观的数据结构表示。格式化程序生成的数据结构表示可以被解释器正确解析,并且也易于人类阅读。如果可能,输出会保留在一行上,并在拆分为多行时缩进。

      【讨论】:

        【解决方案10】:

        可能值得一试——

        Is there a Python equivalent to Perl's Data::Dumper?

        我的建议是这样--

        https://gist.github.com/1071857

        请注意,perl 有一个名为 Data::Dumper 的模块,它将对象数据转换回 perl 源代码(注意:它不会将代码转换回源代码,而且几乎总是你不希望在输出)。这可以用于持久化,但共同目的是用于调试。

        标准python pprint 无法实现许多事情,特别是当它看到一个对象的实例并为您提供对象的内部十六进制指针时它只是停止下降(错误,该指针不是很多顺便说一句)。所以简而言之,python 就是关于这个伟大的面向对象的范例,但是你开箱即用的工具是为处理对象以外的东西而设计的。

        perl Data::Dumper 允许你控制你想要走多远,并且还检测循环链接结构(这非常重要)。这个过程在 perl 中更容易实现,因为对象除了它们的祝福之外没有什么特别的魔力(一个普遍定义良好的过程)。

        【讨论】:

        • 这应该是一个点子和一个deb,而不仅仅是一个要点!
        • > 所以简而言之,python 就是这种伟大的面向对象范式,但是你开箱即用的工具是为处理对象以外的东西而设计的......当您提供的唯一示例是次要模块。
        • @memeplex 哪里说 python 都是关于 OOP?
        • 好吧,它只是说一切都是为了这个伟大的 OOP,我的错。
        • 这仅适用于 2.7
        【解决方案11】:

        为什么不简单:

        for key,value in obj.__dict__.iteritems():
            print key,value
        

        【讨论】:

        • 不应该是for key,value in obj.__dict__.iteritems(): print key,value吗?
        【解决方案12】:

        我需要在一些日志中打印 DEBUG 信息并且无法使用 pprint,因为它会破坏它。相反,我这样做并得到了几乎相同的结果。

        DO = DemoObject()
        
        itemDir = DO.__dict__
        
        for i in itemDir:
            print '{0}  :  {1}'.format(i, itemDir[i])
        

        【讨论】:

          【解决方案13】:

          转储“myObject”:

          from bson import json_util
          import json
          
          print(json.dumps(myObject, default=json_util.default, sort_keys=True, indent=4, separators=(',', ': ')))
          

          我试过 vars() 和 dir();两者都失败了我正在寻找的东西。 vars() 不起作用,因为该对象没有 __dict__ (exceptions.TypeError: vars() 参数必须具有 __dict__ 属性)。 dir() 不是我想要的:它只是一个字段名称列表,没有给出值或对象结构。

          我认为 json.dumps() 可以在没有 default=json_util.default 的情况下适用于大多数对象,但是我在对象中有一个 datetime 字段,因此标准 json 序列化程序失败了。见How to overcome "datetime.datetime not JSON serializable" in python?

          【讨论】:

          • 好吧,是的,必须安装 pymongo 才能使用它。
          【解决方案14】:
          from pprint import pprint
          
          def print_r(the_object):
              print ("CLASS: ", the_object.__class__.__name__, " (BASE CLASS: ", the_object.__class__.__bases__,")")
              pprint(vars(the_object))
          

          【讨论】:

            【解决方案15】:

            如果您使用它进行调试,并且只想递归转储所有内容,那么接受的答案并不令人满意,因为它要求您的类已经具有良好的 __str__ 实现。如果不是这样,这会更好:

            import json
            print(json.dumps(YOUR_OBJECT, 
                             default=lambda obj: vars(obj),
                             indent=1))
            

            【讨论】:

            • 这在 python 3 上不起作用。必须安装 pymongo 并按照@Clark 的回答进行操作
            • 和这里的许多其他答案一样TypeError: vars() argument must have __dict__ attribute
            【解决方案16】:

            这会以 json 或 yaml 缩进格式递归打印出所有对象内容:

            import jsonpickle # pip install jsonpickle
            import json
            import yaml # pip install pyyaml
            
            serialized = jsonpickle.encode(obj, max_depth=2) # max_depth is optional
            print json.dumps(json.loads(serialized), indent=4)
            print yaml.dump(yaml.load(serialized), indent=4)
            

            【讨论】:

              【解决方案17】:

              你可以试试 Flask 调试工具栏。
              https://pypi.python.org/pypi/Flask-DebugToolbar

              from flask import Flask
              from flask_debugtoolbar import DebugToolbarExtension
              
              app = Flask(__name__)
              
              # the toolbar is only enabled in debug mode:
              app.debug = True
              
              # set a 'SECRET_KEY' to enable the Flask session cookies
              app.config['SECRET_KEY'] = '<replace with a secret key>'
              
              toolbar = DebugToolbarExtension(app)
              

              【讨论】:

                【解决方案18】:

                试试ppretty

                from ppretty import ppretty
                
                
                class A(object):
                    s = 5
                
                    def __init__(self):
                        self._p = 8
                
                    @property
                    def foo(self):
                        return range(10)
                
                
                print ppretty(A(), show_protected=True, show_static=True, show_properties=True)
                

                输出:

                __main__.A(_p = 8, foo = [0, 1, ..., 8, 9], s = 5)
                

                【讨论】:

                • 正是我正在寻找的快速调试 :),很棒的发现!
                • 小提示添加 depth=6(或您需要的任何距离)作为它的参数之一,递归细节可以更进一步:)。我喜欢它打印列表的方式之一是它显示了前 2 个条目和最后 2 个条目,所以你知道它正在工作
                【解决方案19】:

                试试beeprint

                它不仅可以帮助您打印对象变量,还可以帮助您输出美观,如下所示:

                class(NormalClassNewStyle):
                  dicts: {
                  },
                  lists: [],
                  static_props: 1,
                  tupl: (1, 2)
                

                【讨论】:

                • 这个模块似乎不再被维护并且有许多未解决的问题。而是使用ppretty
                【解决方案20】:

                我喜欢使用 Python 对象内置类型 keysvalues

                对于属性,无论是方法还是变量:

                o.keys()
                

                对于这些属性的值:

                o.values()
                

                【讨论】:

                  【解决方案21】:

                  对于所有挣扎的人

                  • vars() 不返回所有属性。
                  • dir() 不返回属性值。

                  以下代码打印obj所有属性及其值:

                  for attr in dir(obj):
                          try:
                              print("obj.{} = {}".format(attr, getattr(obj, attr)))
                          except AttributeError:
                              print("obj.{} = ?".format(attr))
                  

                  【讨论】:

                  • 没有错误,但不是递归的,所以只需获得很多十六进制地址
                  【解决方案22】:

                  我赞成只提到 pprint 的答案。需要明确的是,如果您想查看复杂数据结构中的所有 ,请执行以下操作:

                  from pprint import pprint
                  pprint(my_var)
                  

                  my_var 是您感兴趣的变量。当我使用pprint(vars(my_var)) 时,我什么也没得到,这里的其他答案没有帮助,或者该方法看起来不必要地长。顺便说一句,在我的特殊情况下,我正在检查的代码有一个字典。

                  值得指出的是,对于一些自定义类,您最终可能会得到无用的 &lt;someobject.ExampleClass object at 0x7f739267f400&gt; 类型的输出。在这种情况下,您可能必须实现 __str__ 方法,或尝试其他一些解决方案。

                  我还发现,在我得到这种object 输出类型的一个实例中,vars() 向我展示了我想要的东西。因此,涵盖这两种情况的更好解决方案是分别尝试这两种情况。但是使用vars()有时会抛出异常,例如TypeError: vars() argument must have __dict__ attribute

                  我仍然希望找到适用于所有场景的简单工具,无需第三方库。

                  【讨论】:

                  • >带有一些自定义类...这就是我不喜欢 python 的原因。事情“有时”有效,“有时”无效
                  【解决方案23】:

                  我推荐使用help(your_object)

                  help(dir)

                   If called without an argument, return the names in the current scope.
                   Else, return an alphabetized list of names comprising (some of) the attributes
                   of the given object, and of attributes reachable from it.
                   If the object supplies a method named __dir__, it will be used; otherwise
                   the default dir() logic is used and returns:
                   for a module object: the module's attributes.
                   for a class object:  its attributes, and recursively the attributes
                   of its bases.
                   for any other object: its attributes, its class's attributes, and
                   recursively the attributes of its class's base classes.
                  

                  help(vars)

                  Without arguments, equivalent to locals().
                  With an argument, equivalent to object.__dict__.
                  

                  【讨论】:

                    【解决方案24】:

                    是否有一个内置函数可以打印对象的所有当前属性和值?

                    没有。投票最多的答案排除了某些类型的属性,接受的答案显示了如何获取 all 属性,包括非公共 api 的方法和部分。但是没有很好的完整的 builtin 功能。

                    所以简短的推论是您可以编写自己的,但它会计算属于公共 API 一部分的属性和其他计算的数据描述符,您可能不希望这样:

                    from pprint import pprint
                    from inspect import getmembers
                    from types import FunctionType
                    
                    def attributes(obj):
                        disallowed_names = {
                          name for name, value in getmembers(type(obj)) 
                            if isinstance(value, FunctionType)}
                        return {
                          name: getattr(obj, name) for name in dir(obj) 
                            if name[0] != '_' and name not in disallowed_names and hasattr(obj, name)}
                    
                    def print_attributes(obj):
                        pprint(attributes(obj))
                    

                    其他答案的问题

                    观察当前投票最多的答案在具有许多不同类型数据成员的类上的应用:

                    from pprint import pprint
                    
                    class Obj:
                        __slots__ = 'foo', 'bar', '__dict__'
                        def __init__(self, baz):
                            self.foo = ''
                            self.bar = 0
                            self.baz = baz
                        @property
                        def quux(self):
                            return self.foo * self.bar
                    
                    obj = Obj('baz')
                    pprint(vars(obj))
                    

                    仅打印:

                    {'baz': 'baz'}
                    

                    因为vars返回一个对象的__dict__,而且它不是一个副本,所以如果你修改vars返回的dict,你也修改了__dict__的对象本身。

                    vars(obj)['quux'] = 'WHAT?!'
                    vars(obj)
                    

                    返回:

                    {'baz': 'baz', 'quux': 'WHAT?!'}
                    

                    -- 这很糟糕,因为 quux 是一个我们不应该设置的属性,也不应该在命名空间中......

                    在当前接受的答案(和其他)中应用建议也好不到哪里去:

                    >>> dir(obj)
                    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', 'bar', 'baz', 'foo', 'quux']
                    

                    正如我们所见,dir 只返回所有(实际上只是大多数)与对象关联的名称。

                    在 cmets 中提到的

                    inspect.getmembers 也有类似的缺陷 - 它返回所有名称 值。

                    来自班级

                    在教学时,我让我的学生创建一个函数来提供对象的语义公共 API:

                    def api(obj):
                        return [name for name in dir(obj) if name[0] != '_']
                    

                    我们可以扩展它以提供对象语义命名空间的副本,但我们需要排除未分配的__slots__,并且如果我们正在接受“当前属性”严重,我们需要排除计算属性(因为它们可能变得昂贵,并且可能被解释为不是“当前”):

                    from types import FunctionType
                    from inspect import getmembers
                    
                    def attrs(obj):
                        disallowed_properties = {
                            name for name, value in getmembers(type(obj)) 
                            if isinstance(value, (property, FunctionType))
                        }
                        return {
                            name: getattr(obj, name) for name in api(obj) 
                            if name not in disallowed_properties and hasattr(obj, name)
                        }
                    
                    

                    现在我们不计算或显示属性 quux:

                    >>> attrs(obj)
                    {'bar': 0, 'baz': 'baz', 'foo': ''}
                    

                    注意事项

                    但也许我们确实知道我们的房产并不昂贵。我们可能想要更改逻辑以包含它们。也许我们想排除 other custom 数据描述符。

                    那么我们需要进一步定制这个功能。因此,我们不能拥有一个神奇地知道我们想要什么并提供它的内置函数是有道理的。这是我们需要自己创建的功能。

                    结论

                    没有执行此操作的内置函数,您应该根据您的情况执行最符合语义的操作。

                    【讨论】:

                    • pypi.org/project/beeprint(或github.com/panyanyany/beeprint)漂亮地打印“所有内容”并且递归地打印。
                    • 从函数中获取自定义的参数是什么
                    • @NZD 不适用于from collections import * ; obj=Counter([3,4])
                    • 这是最全面的答案,应该得到更多的支持
                    【解决方案25】:

                    无论您的变量是如何在类中、在 __init__ 内部或外部定义的,这都有效。

                    your_obj = YourObj()
                    attrs_with_value = {attr: getattr(your_obj, attr) for attr in dir(your_obj)}
                    

                    【讨论】:

                    • 添加排除所有内置变量(方法、函数等):{attr: getattr(your_obj, attr) for attr in dir(your_obj) and "__" not in attr}
                    【解决方案26】:

                    answer开始,可以稍微修改一下,只获取对象的“属性”,如下所示:

                    def getAttributes(obj):
                        from pprint import pprint
                        from inspect import getmembers
                        from types import FunctionType
                        
                        def attributes(obj):
                            disallowed_names = {
                              name for name, value in getmembers(type(obj)) 
                                if isinstance(value, FunctionType)}
                            return {
                              name for name in dir(obj) 
                                if name[0] != '_' and name not in disallowed_names and hasattr(obj, name)}
                        pprint(attributes(obj))
                    

                    在临时添加此功能时很有帮助,无需对现有源代码进行太多更改即可将其删除

                    【讨论】:

                      【解决方案27】:

                      该项目修改 pprint 以显示所有对象字段值,它忽略了对象__repr__ 成员函数,它还递归到嵌套对象中。它适用于 python3,请参阅https://github.com/MoserMichael/pprintex 可以通过 pip 安装:pip install printex

                      【讨论】:

                        【解决方案28】:

                        虽然有很多很好的答案,但这里有一个 1-liner,可以提供属性 AS WELL AS 值:

                        (str(vars(config)).split(",")[1:])
                        

                        其中'config'是有问题的对象。我将此列为单独的答案,因为我只想简单地打印对象的相关值(不包括 __main 等)而不使用循环或漂亮的打印并且没有找到方便的答案。

                        【讨论】:

                          【解决方案29】:

                          vars() 似乎显示了该对象的属性,但 dir() 似乎也显示了父类的属性。您通常不需要查看继承的属性,例如 strdocdict

                          In [1]: class Aaa():
                          ...:     def __init__(self, name, age):
                          ...:         self.name = name
                          ...:         self.age = age
                          ...:
                          In [2]: class Bbb(Aaa):
                          ...:     def __init__(self, name, age, job):
                          ...:         super().__init__(name, age)
                          ...:         self.job = job
                          ...:
                          In [3]: a = Aaa('Pullayya',42)
                          
                          In [4]: b = Bbb('Yellayya',41,'Cop')
                          
                          In [5]: vars(a)
                          Out[5]: {'name': 'Pullayya', 'age': 42}
                          
                          In [6]: vars(b)
                          Out[6]: {'name': 'Yellayya', 'age': 41, 'job': 'Cop'}
                          
                          In [7]: dir(a)
                          Out[7]:
                          ['__class__',
                           '__delattr__',
                           '__dict__',
                           '__dir__',
                           '__doc__',
                           '__eq__',
                           ...
                           ...
                           '__subclasshook__',
                           '__weakref__',
                           'age',
                           'name']
                          

                          【讨论】:

                            猜你喜欢
                            • 2018-12-28
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2023-03-11
                            • 2011-03-03
                            • 1970-01-01
                            • 1970-01-01
                            • 2010-10-25
                            相关资源
                            最近更新 更多