有没有Python中的函数来打印一个对象的所有当前的属性和值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有Python中的函数来打印一个对象的所有当前的属性和值相关的知识,希望对你有一定的参考价值。

参考技术A 1. 你是两个不同的事情真的混在一起。
使用dir()或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',
...

2.
你想瓦尔()与PPRINT混合:
from pprint import pprint
pprint (vars(your_object))

3.
def dump(obj):
for attr in dir(obj):
print "obj.%s = %s" % (attr, getattr(obj, attr))

4.
目录有但只会给你的属性'如果你希望自己的价值观,以及尝试的__dict__。
class O:
def __init__ (self):
self.value = 3
o = O()

>>> o.__dict__
'值':3
5.
你的“目录()”函数来做到这一点。
>>> 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
CodeGo.net
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

6.
要打印的对象,你可能的当前状态:
>>> obj # in an interpreter


print repr(obj) # in a script


print obj

为你的类定义__str__或__repr__方法。从Python__repr__(self)由被叫repr()内置函数和字符串
转换(反引号)
计算“官方”的字符串
一个对象的表示。如果在所有
可能的话,这应该看起来像一个
有效的Python表达式,可能是
用于重新创建的对象与
值(给定一个适当的
如果这是不可能的 CodeGo.net,
一个字符串表单的“<...有用
描述...>“应该返回。
返回值必须是一个字符串
对象。如果一个类定义再版()
但不__str__(),然后__repr__()是
当一个“非正式”的字符串
的该实例的代表性
类是必需的。这通常是
用于调试,所以重要的是
该项表示是
信息丰富,__str__(self)由被叫str()内置函数和由打印
“非正式”
一个对象的字符串表示表单。
这不同于__repr__()在这
它并不必须是一个有效的Python
表达式:更方便或
简洁的表述,如
代替。返回值必须是一个
字符串对象。
7.
可能是值得一试-
是否有相当于Perl的Data ::自卸车一个Python?
我是这样的-
需要注意的是Perl有一个名为Data ::
Dumper模块的转换对象数据返回到perl的源代码(注:它并没有转化代码回到源,而且几乎总是你不想在输出的函数)。这可持久性,但目的是为了调
试。
有许多事情标准的python
PPRINT未能达到,尤其是刚刚停止时,看到一个对象的实例,并为您的对象的内六角指针(降序呃,这个指针是不是一大堆的方式)。因此,概括地
说,python是所有关于这个伟大的面向对象的范式,但你得到的开箱即用的工具是专为与对象比其他工作。
在Perl的Data ::
Dumper允许你控制你想有多深去,并且还检测循环链表结构(这是非常重要的)。这个过程是比较容易实现的perl的对象有超越他们的祝福没有特别的魔
法(一个普遍良好定义的线程)。
8.
在大多数情况下,使用__dict__或dir()你将会得到你想要。如果您碰巧需要更多的细节,标准库包含了inspect模块,它可以让你获得细节令人印象深刻的金额。真正的nuggests包括:
函数
类层次结构
的一个函数/类对象的源代码
局部变量出对象的
如果你只是寻找“没有我的对象有什么属性值?”,然后dir()和__dict__可能是足够的。如果你真的希望挖掘到任意对象的当前状态(牢记在python几乎一切都是对象),然后inspect是值得考虑的。
9.
例如转储对象的魔法:

$猫dump.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



$pythondump.py

<__main__.Data instance at 0x00A052D8>

与灵知utils的:

$pythondump.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>

这是一个有点过时,但仍然坚持工作。
10.
PPRINT包含一个“漂亮的打印机”为你制造数据结构的美观交涉。格式化器产生的数据结构的表示,可以正确地由解释器进行解析,并且也很容易对一个人的阅读。输出保持在一行上,如果可能的话,与缩进时,多行拆分。
11.
为什么不能简单的:
关键,在obj的值。字典iteritems()。:
打印键,值
12.
我需要在日志中打印并无法PPRINT它会打破它。相反,我这样做,并几乎得到了的东西。
DO = DemoObject()
itemDir = DO.__dict__
for i in itemDir:
print '0 : 1'.format(i, itemDir[i])

返回/打印句子中的位数或错误消息

【中文标题】返回/打印句子中的位数或错误消息【英文标题】:Return/print amount of digits in a sentence OR an error message 【发布时间】:2012-12-04 23:46:02 【问题描述】:

我是该网站和 python 的新手,所以我希望我能提供所有必需的信息。我已经搜索过这个问题,但似乎没有一个解决方案适合我。

我正在尝试创建一个函数来读取一些文本并返回它包含的位数。例如:

"It is 2012" , 应该返回 "Text has 4 digits"

如果没有数字,它应该返回不同的消息,例如:

"今天是星期一",应该返回"文本不包含数字"

所以我写了这个:

def CountNumbers(txt):
    sum = 0

    for n in txt:
        if n.isdigit() == False:
            print ("Text does not contain digits")

        else:
            sum += 1


    print("Text has", sum, "digit(s)")


txt = str(input("Write some text: "))
(CountNumbers(txt))

功能似乎还可以,但打印结果错误,例如:

Write some text: 65
Text has 2 digit(s) #this is ok, but...

当我只输入文字时:

Write some text: sd 
Text does not contain digits
Text does not contain digits
Text does not contain digits
Text has 0 digit(s)

当我输入文本和数字时(但首先输入文本):

Write some text: sd 564
Text does not contain digits
Text does not contain digits
Text does not contain digits
Text has 3 digit(s)

我知道我的错误在于块,(我认为),但我还没有想出办法,因为当我使用 return 时,它会在完成阅读文本之前停止。我已经尝试了大约 20 多种不同的方法,请帮助我!

谢谢!!

附:我需要它作为 .py 而不仅仅是在 IDLE (Python Shell) 窗口中工作,这就是我编写这样的块的原因。

【问题讨论】:

+1 表示简短的自包含代码和示例输入/输出。多个样品,甚至!喜欢它。 请记住,根据 Python 的命名约定,您的函数应命名为 count_numbers() 而不是 CountNumbers 另外,你不应该将变量命名为sum,因为这是一个内置函数的名称。 非常感谢你们!...我知道我很接近...这 python 的东西对我来说真的很复杂哈哈哈...谢谢! 是的,我不知道,因为我实际上是在用西班牙语编写代码,所以当我在这里翻译代码来询问它时,变量 suma(西班牙语为 sum)变成了 sum,直到在那之后我才意识到 sum 也是一个函数......它仍然有效,但我还是改变了它:P 【参考方案1】:

我刚刚解决了你的代码问题:

def CountNumbers(txt):
    sum = 0

    for n in txt:
        if n.isdigit():
            sum += 1

    if sum:
        print("Text has", sum, "digit(s)")
    else:
        print ("Text does not contain digits")


CountNumbers(input("Write some text: "))

【讨论】:

您的回答真的很有帮助,非常感谢! ...我想知道,为什么你不写 if sum > 0: 和 just if sum ... 它们都有效,但我想知道为什么。我认为只是“如果总和:”甚至不是一个条件!哈哈 @user1911059 - 如果您将数字评估为布尔值,则如果它为零,则为 False,否则为 True。所以在像if sum: 这样的语句中,如果sum 大于零,即至少有一个数字,则为True【参考方案2】:

问题是每次遇到非数字字符时都会打印“文本不包含数字”消息。当您知道有多少个字符时,尝试将该打印语句移到循环之后:

def CountNumbers(txt):
    sum = 0

    for n in txt:
        if n.isdigit():
            sum += 1

    if sum > 0:   
        print("Text has", sum, "digit(s)")
    else:
        print ("Text does not contain digits")

txt = str(input("Write some text: "))
(CountNumbers(txt))

编辑:关于优秀 Python 代码的几点:

如您问题的 cmets 中所述,按照惯例,Python 中的函数/方法以小写字母命名,并带有下划线,即 count_numbers 而不是 CountNumbers。 迂腐模式:您计算的是字符串中的数字,而不是数字,因此为了清楚起见,它应该真正命名为 count_digits。 有一个名为sum 的内置Python 函数。通过使用同名变量来隐藏这个函数被认为是不好的做法。我会将您的 sum 变量重命名为 count。 无需将函数调用括在括号中(它不会造成任何伤害,除了在恕我直言时看起来很糟糕)。

通过这些更改,您的代码变为:

def count_digits(txt):
    count = 0

    for n in txt:
        if n.isdigit():
            count += 1

    if count > 0:   
        print("Text has", count, "digit(s)")
    else:
        print ("Text does not contain digits")

txt = str(input("Write some text: "))
count_digits(txt)

【讨论】:

【参考方案3】:

提前退货还不错,可以大大简化代码:

def CountNumbers(txt):
    for n in txt:
        if not n.isdigit():
            print ("Text does not contain digits")
            return

    print("Text has", len(txt), "digit(s)")

txt = str(input("Write some text: "))
(CountNumbers(txt))

此函数在出现非数字字符时立即返回,或打印输入字符串的长度(由 个数字组成)。

你也可以用这样的“生成表达式”来写:

def CountNumbers(txt):
    if all(char.isdigit() for char in txt):
        print("Text has", len(txt), "digit(s)")
    else:
        print ("Text does not contain digits")

txt = str(input("Write some text: "))
(CountNumbers(txt))

现在,Python 函数更典型地返回值并让调用代码对其进行操作。此版本返回字符串并让程序的“主要”部分打印结果。它还将函数重命名为全小写(Python 通常使用大写的类名称):

def countnumbers(txt):
    if all(char.isdigit() for char in txt):
        return "Text has %d digit(s)" % len(txt)
    else:
        return "Text does not contain digits"

txt = str(input("Write some text: "))
print(countnumbers(txt))

嗯,不要太破旧!但是 Python 也有漂亮的条件表达式,比如:

def countnumbers(txt):
    return ("Text has %d digit(s)" % len(txt)
        if all(char.isdigit() for char in txt)
        else "Text does not contain digits")

txt = str(input("Write some text: "))
print(countnumbers(txt))

最后,也许你想把它做成一个合适的模块,以便其他代码可以使用它。像这样包装程序的交互部分,它只会在您像命令行脚本一样运行它时执行,但如果您将其作为模块导入,则不会

def countnumbers(txt):
    return ("Text has %d digit(s)" % len(txt)
        if all(char.isdigit() for char in txt)
        else "Text does not contain digits")

if __name__ == '__main__':
    txt = str(input("Write some text: "))
    print(countnumbers(txt))

如果我将该函数编写为生产系统的一部分,那将非常接近它的外观。请注意,逻辑 与您的第一次尝试相同。最大的不同是这个版本让 Python 完成了大部分工作。

【讨论】:

哇这真的很有趣,我仍然不熟悉这种写作,但这确实扩大了我的理解。谢谢! 检查下面的 cmets - 上面的 all(char.isdigit() for char in txt) 不能按预期工作 - 应该是 all([char.isdigit() for char in txt])。除此之外,原始问题指出:'"It is 2012" ,应该返回 "Text has 4 digits"'。在这种情况下,短路不会给出错误的答案吗?【参考方案4】:

对原版进行了稍微 Pythonic 的改造。就个人而言,我发现“列表理解”形式更容易阅读(除非它是嵌套的):

def count_digits(txt):
    count = len([c for c in txt if c.isdigit()])

    if count > 0:
        print ("Text has", count, "digit(s)")
    else:
        print ("Text does not contain digits")

【讨论】:

在 Python 2.4+ 中,您可以将其写为 count = len(c for c in txt if c.isdigit())。那是一个“生成器表达式”。 我之前尝试过,得到了'object of type 'generator' has no len()'。在 IPython 中运行 2.7.3。 忽略我。我的下午咖啡还没有开始。 :-D

以上是关于有没有Python中的函数来打印一个对象的所有当前的属性和值的主要内容,如果未能解决你的问题,请参考以下文章

python ftplib.FTP 获取当前路径下所有目录

Python学习20:利用函数来打印文件内容

Python------内置函数

Python_对象(实例)

this指针详解

程序中打印当前进程的调用堆栈(backtrace)