如何让IDE识别Python中的excel函数公式大全参数类型?

在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
很多IDE,比如VisualStudio,Eclipse都有智能提示功能,输入一个类,就提示你有什么方法。
Python有没有,感觉没有好不方便。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
找到办法了,VS有PTVS
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:Python 代码调试技巧
使用 pdb 进行调试pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令,详情见表 1。表 1. pdb 常用命令命令解释break 或 b 设置断点设置断点continue 或 c继续执行程序list 或 l查看当前行的代码段step 或 s 进入函数return 或 r执行代码直到从当前函数返回exit 或 q中止并退出next 或 n 执行下一行pp 打印变量的值help帮助下面结合具体的实例讲述如何使用 pdb 进行调试。清单 1. 测试代码示例import pdb
pdb.set_trace()
final = a + b + c
print final开始调试:直接运行脚本,会停留在 pdb.set_trace() 处,选择 n+enter 可以执行当前的 statement。在第一次按下了 n+enter 之后可以直接按 enter 表示重复执行上一条 debug 命令。清单 2. 利用 pdb 调试[root@rcc-pok-idg-2255 ~]#
python epdb1.py
& /root/epdb1.py(4)?()
-& b = "bbb"
& /root/epdb1.py(5)?()
-& c = "ccc"
& /root/epdb1.py(6)?()
-& final = a + b + c
(Pdb) list
import pdb
pdb.set_trace()
-& final = a + b + c
print final
& /root/epdb1.py(7)?()
-& print final
(Pdb)退出 debug:使用 quit 或者 q 可以退出当前的 debug,但是 quit 会以一种非常粗鲁的方式退出程序,其结果是直接 crash。清单 3. 退出 debug[root@rcc-pok-idg-2255 ~]#
python epdb1.py
& /root/epdb1.py(4)?()
-& b = "bbb"
& /root/epdb1.py(5)?()
-& c = "ccc"
Traceback (most recent call last):
File "epdb1.py", line 5, in ?
File "epdb1.py", line 5, in ?
File "/usr/lib64/python2.4/bdb.py", line 48, in trace_dispatch
return self.dispatch_line(frame)
File "/usr/lib64/python2.4/bdb.py", line 67, in dispatch_line
if self.quitting: raise BdbQuit
bdb.BdbQuit打印变量的值:如果需要在调试过程中打印变量的值,可以直接使用 p 加上变量名,但是需要注意的是打印仅仅在当前的 statement 已经被执行了之后才能看到具体的值,否则会报 NameError: & exceptions.NameError … ....& 错误。清单 4. debug 过程中打印变量[root@rcc-pok-idg-2255 ~]#
python epdb1.py
& /root/epdb1.py(4)?()
-& b = "bbb"
& /root/epdb1.py(5)?()
-& c = "ccc"
& /root/epdb1.py(6)?()
-& final = a + b + c
(Pdb) p final
*** NameError: &exceptions.NameError instance at 0x &
& /root/epdb1.py(7)?()
-& print final
(Pdb) p final
'aaabbbccc'
(Pdb)使用 c 可以停止当前的 debug 使程序继续执行。如果在下面的程序中继续有 set_statement() 的申明,则又会重新进入到 debug 的状态,读者可以在代码 print final 之前再加上 set_trace() 验证。清单 5. 停止 debug 继续执行程序[root@rcc-pok-idg-2255 ~]#
python epdb1.py
& /root/epdb1.py(4)?()
-& b = "bbb"
& /root/epdb1.py(5)?()
-& c = "ccc"
aaabbbccc显示代码:在 debug 的时候不一定能记住当前的代码块,如要要查看具体的代码块,则可以通过使用 list 或者 l 命令显示。list 会用箭头 -& 指向当前 debug 的语句。清单 6. debug 过程中显示代码[root@rcc-pok-idg-2255 ~]#
python epdb1.py
& /root/epdb1.py(4)?()
-& b = "bbb"
(Pdb) list
import pdb
pdb.set_trace()
-& b = "bbb"
final = a + b + c
pdb.set_trace()
print final
& /root/epdb1.py(8)?()
-& print final
(Pdb) list
pdb.set_trace()
final = a + b + c
pdb.set_trace()
-& print final
(Pdb)在使用函数的情况下进行 debug清单 7. 使用函数的例子import pdb
def combine(s1,s2):
# define subroutine combine, which...
s3 = s1 + s2 + s1
# sandwiches s2 between copies of s1, ...
s3 = '"' + s3 +'"'
# encloses it in double quotes,...
# and returns it.
pdb.set_trace()
final = combine(a,b)
print final如果直接使用 n 进行 debug 则到 final=combine(a,b) 这句的时候会将其当做普通的赋值语句处理,进入到 print final。如果想要对函数进行 debug 如何处理呢 ? 可以直接使用 s 进入函数块。函数里面的单步调试与上面的介绍类似。如果不想在函数里单步调试可以在断点处直接按 r 退出到调用的地方。清单 8. 对函数进行 debug[root@rcc-pok-idg-2255 ~]# python epdb2.py
& /root/epdb2.py(10)?()
-& b = "bbb"
& /root/epdb2.py(11)?()
-& c = "ccc"
& /root/epdb2.py(12)?()
-& final = combine(a,b)
& /root/epdb2.py(3)combine()
-& def combine(s1,s2):
# define subroutine combine, which...
& /root/epdb2.py(4)combine()
-& s3 = s1 + s2 + s1
# sandwiches s2 between copies of s1, ...
(Pdb) list
import pdb
def combine(s1,s2):
# define subroutine combine, which...
s3 = s1 + s2 + s1
# sandwiches s2 between copies of s1, ...
s3 = '"' + s3 +'"'
# encloses it in double quotes,...
# and returns it.
pdb.set_trace()
& /root/epdb2.py(5)combine()
-& s3 = '"' + s3 +'"'
# encloses it in double quotes,...
& /root/epdb2.py(6)combine()
-& return s3
# and returns it.
--Return--
& /root/epdb2.py(6)combine()-&'"aaabbbaaa"'
-& return s3
# and returns it.
& /root/epdb2.py(13)?()
-& print final
(Pdb)在调试的时候动态改变值 。在调试的时候可以动态改变变量的值,具体如下实例。需要注意的是下面有个错误,原因是 b 已经被赋值了,如果想重新改变 b 的赋值,则应该使用! B。清单 9. 在调试的时候动态改变值[root@rcc-pok-idg-2255 ~]# python epdb2.py
& /root/epdb2.py(10)?()
-& b = "bbb"
(Pdb) var = "1234"
(Pdb) b = "avfe"
*** The specified object '= "avfe"' is not a function
or was not found along sys.path.
(Pdb) !b="afdfd"
(Pdb)pdb 调试有个明显的缺陷就是对于多线程,远程调试等支持得不够好,同时没有较为直观的界面显示,不太适合大型的 python 项目。而在较大的 python 项目中,这些调试需求比较常见,因此需要使用更为高级的调试工具。接下来将介绍 PyCharm IDE 的调试方法 .使用 PyCharm 进行调试PyCharm 是由 JetBrains 打造的一款 Python IDE,具有语法高亮、Project 管理、代码跳转、智能提示、自动完成、单元测试、版本控制等功能,同时提供了对 Django 开发以及 Google App Engine 的支持。分为个人独立版和商业版,需要 license 支持,也可以获取免费的 30 天试用。试用版本的 Pycharm 可以在官网上下载,下载地址为:/pycharm/download/index.html。
PyCharm 同时提供了较为完善的调试功能,支持多线程,远程调试等,可以支持断点设置,单步模式,表达式求值,变量查看等一系列功能。PyCharm IDE 的调试窗口布局如图 1 所示。图 1. PyCharm IDE 窗口布局下面结合实例讲述如何利用 PyCharm 进行多线程调试。具体调试所用的代码实例见清单 10。清单 10. PyCharm 调试代码实例__author__ = 'zhangying'
#!/usr/bin/python
import thread
import time
# Define a function for the thread
def print_time( threadName, delay):
while count &
count += 1
print "%s: %s" % ( threadName, time.ctime(time.time()) )
def check_sum(threadName,valueA,valueB):
print "to calculate the sum of two number her"
result=sum(valueA,valueB)
print "the result is" ,
def sum(valueA,valueB):
if valueA &0 and valueB&0:
return valueA+valueB
def readFile(threadName, filename):
file = open(filename)
for line in file.xreadlines():
print line
thread.start_new_thread( print_time, ("Thread-1", 2, ) )
thread.start_new_thread( check_sum, ("Thread-2", 4,5, ) )
thread.start_new_thread( readFile, ("Thread-3","test.txt",))
print "Error: unable to start thread"
print "end"
pass在调试之前通常需要设置断点,断点可以设置在循环或者条件判断的表达式处或者程序的关键点。设置断点的方法非常简单:在代码编辑框中将光标移动到需要设置断点的行,然后直接按 Ctrl+F8 或者选择菜单"Run"-&"Toggle Line Break Point",更为直接的方法是双击代码编辑处左侧边缘,可以看到出现红色的小圆点(如图 2)。当调试开始的时候,当前正在执行的代码会直接显示为蓝色。下图中设置了三个断点,蓝色高亮显示的为正在执行的代码。图 2. 断点设置表达式求值:在调试过程中有的时候需要追踪一些表达式的值来发现程序中的问题,Pycharm 支持表达式求值,可以通过选中该表达式,然后选择“Run”-&”Evaluate Expression”,在出现的窗口中直接选择 Evaluate 便可以查看。Pychar 同时提供了 Variables 和 Watches 窗口,其中调试步骤中所涉及的具体变量的值可以直接在 variable 一栏中查看。图 3. 变量查看如果要动态的监测某个变量可以直接选中该变量并选择菜单”Run”-&”Add Watch”添加到 watches 栏中。当调试进行到该变量所在的语句时,在该窗口中可以直接看到该变量的具体值。图 4. 监测变量对于多线程程序来说,通常会有多个线程,当需要 debug 的断点分别设置在不同线程对应的线程体中的时候,通常需要 IDE 有良好的多线程调试功能的支持。 Pycharm 中在主线程启动子线程的时候会自动产生一个 Dummy 开头的名字的虚拟线程,每一个 frame 对应各自的调试帧。如图 5,本实例中一共有四个线程,其中主线程生成了三个线程,分别为 Dummy-4,Dummy-5,Dummy-6. 其中 Dummy-4 对应线程 1,其余分别对应线程 2 和线程 3。图 5. 多线程窗口当调试进入到各个线程的子程序时,Frame 会自动切换到其所对应的 frame,相应的变量栏中也会显示与该过程对应的相关变量,如图 6,直接控制调试按钮,如 setp in,step over 便可以方便的进行调试。图 6. 子线程调试查看。使用 PyDev 进行调试PyDev 是一个开源的的 plugin,它可以方便的和 Eclipse 集成,提供方便强大的调试功能。同时作为一个优秀的 Python IDE 还提供语法错误提示、源代码编辑助手、Quick Outline、Globals Browser、Hierarchy View、运行等强大功能。下面讲述如何将 PyDev 和 Eclipse 集成。在安装 PyDev 之前,需要先安装 Java 1.4 或更高版本、Eclipse 以及 Python。
第一步:启动 Eclipse,在 Eclipse 菜单栏中找到 Help 栏,选择 Help & Install New Software,并选择 Add button,添加 Ptdev 的下载站点 http://pydev.org/updates。选择 PyDev 之后完成余下的步骤便可以安装 PyDev。图 7. 安装 PyDev安装完成之后需要配置 Python 解释器,在 Eclipse 菜单栏中,选择 Window & Preferences & Pydev & Interpreter – Python。Python 安装在 C:\Python27 路径下。单击 New,选择 Python 解释器 python.exe,打开后显示出一个包含很多复选框的窗口,选择需要加入系统 PYTHONPATH 的路径,单击 OK。图 8. 配置 PyDev在配置完 Pydev 之后,可以通过在 Eclipse 菜单栏中,选择 File & New & Project & Pydev &Pydev Project,单击 Next 创建 Python 项目,下面的内容假设 python 项目已经创建,并且有个需要调试的脚本 remote.py(具体内容如下),它是一个登陆到远程机器上去执行一些命令的脚本,在运行的时候需要传入一些参数,下面将详细讲述如何在调试过程中传入参数 .清单 11. Pydev 调试示例代码 #!/usr/bin/env python
def telnetdo(HOST=None, USER=None, PASS=None, COMMAND=None): #define a function
import telnetlib, sys
if not HOST:
HOST = sys.argv[1]
USER = sys.argv[2]
PASS = sys.argv[3]
COMMAND = sys.argv[4]
print "Usage: remote.py host user pass command"
tn = telnetlib.Telnet() #
tn.open(HOST)
print "Cannot open host"
tn.read_until("login:")
tn.write(USER + '\n')
tn.read_until("Password:")
tn.write(PASS + '\n')
tn.write(COMMAND + '\n')
tn.write("exit\n")
tmp = tn.read_all()
tn.close()
return tmp
if __name__ == '__main__':
print telnetdo()在调试的时候有些情况需要传入一些参数,在调试之前需要进行相应的配置以便接收所需要的参数,选择需要调试的程序(本例 remote.py),该脚本在 debug 的过程中需要输入四个参数:host,user,password 以及命令。在 eclipse 的工程目录下选择需要 debug 的程序,单击右键,选择“Debug As”-&“Debug Configurations”,在 Arguments Tab 页中选择“Variables”。如下
图 9 所示 .图 9. 配置变量在窗口”Select Variable”之后选择“Edit Varuables” ,出现如下窗口,在下图中选择”New” 并在弹出的窗口中输入对应的变量名和值。特别需要注意的是在值的后面一定要有空格,不然所有的参数都会被当做第一个参数读入。图 10. 添加具体变量按照以上方式依次配置完所有参数,然后在”select variable“窗口中安装参数所需要的顺序依次选择对应的变量。配置完成之后状态如下图 11 所示。图 11. 完成配置选择 Debug 便可以开始程序的调试,调试方法与 eclipse 内置的调试功能的使用相似,并且支持多线程的 debug,这方面的文章已经有很多,读者可以自行搜索阅读,或者参考”使用 Eclipse 平台进行调试“一文。使用日志功能达到调试的目的日志信息是软件开发过程中进行调试的一种非常有用的方式,特别是在大型软件开发过程需要很多相关人员进行协作的情况下。开发人员通过在代码中加入一些特定的能够记录软件运行过程中的各种事件信息能够有利于甄别代码中存在的问题。这些信息可能包括时间,描述信息以及错误或者异常发生时候的特定上下文信息。
最原始的 debug 方法是通过在代码中嵌入 print 语句,通过输出一些相关的信息来定位程序的问题。但这种方法有一定的缺陷,正常的程序输出和 debug 信息混合在一起,给分析带来一定困难,当程序调试结束不再需要 debug 输出的时候,通常没有很简单的方法将 print 的信息屏蔽掉或者定位到文件。python 中自带的 logging 模块可以比较方便的解决这些问题,它提供日志功能,将 logger 的 level 分为五个级别,可以通过 Logger.setLevel(lvl) 来设置。默认的级别为 warning。表 2. 日志的级别Level使用情形DEBUG详细的信息,在追踪问题的时候使用INFO正常的信息WARNING一些不可预见的问题发生,或者将要发生,如磁盘空间低等,但不影响程序的运行ERROR由于某些严重的问题,程序中的一些功能受到影响CRITICAL严重的错误,或者程序本身不能够继续运行logging lib 包含 4 个主要对象logger:logger 是程序信息输出的接口。它分散在不同的代码中使得程序可以在运行的时候记录相应的信息,并根据设置的日志级别或 filter 来决定哪些信息需要输出并将这些信息分发到其关联的 handler。常用的方法有 Logger.setLevel(),Logger.addHandler() ,Logger.removeHandler() ,Logger.addFilter() ,Logger.debug(), (), Logger.warning(), Logger.error(),getLogger() 等。logger 支持层次继承关系,子 logger 的名称通常是父 logger.name 的方式。如果不创建 logger 的实例,则使用默认的 root logger,通过 logging.getLogger() 或者 logging.getLogger("") 得到 root logger 实例。Handler:Handler 用来处理信息的输出,可以将信息输出到控制台,文件或者网络。可以通过 Logger.addHandler() 来给 logger 对象添加 handler,常用的 handler 有 StreamHandler 和 FileHandler 类。StreamHandler 发送错误信息到流,而 FileHandler 类用于向文件输出日志信息,这两个 handler 定义在 logging 的核心模块中。其他的 hander 定义在 logging.handles 模块中,如 HTTPHandler,SocketHandler。Formatter:Formatter 则决定了 log 信息的格式 , 格式使用类似于 %(& dictionary key &)s 的形式来定义,如'%(asctime)s - %(levelname)s - %(message)s',支持的 key 可以在 python 自带的文档 LogRecord attributes 中查看。Filter:Filter 用来决定哪些信息需要输出。可以被 handler 和 logger 使用,支持层次关系,比如如果设置了 filter 为名称为 A.B 的 logger,则该 logger 和其子 logger 的信息会被输出,如 A.B,A.B.C.清单 12. 日志使用示例import logging
LOG1=logging.getLogger('b.c')
LOG2=logging.getLogger('d.e')
filehandler = logging.FileHandler('test.log','a')
formatter = logging.Formatter('%(name)s %(asctime)s %(levelname)s %(message)s')
filehandler.setFormatter(formatter)
filter=logging.Filter('b')
filehandler.addFilter(filter)
LOG1.addHandler(filehandler)
LOG2.addHandler(filehandler)
LOG2.setLevel(logging.DEBUG)
LOG1.debug('it is a debug info for log1')
('normal infor for log1')
LOG1.warning('warning info for log1:b.c')
LOG1.error('error info for log1:abcd')
LOG1.critical('critical info for log1:not worked')
LOG2.debug('debug info for log2')
('normal info for log2')
LOG2.warning('warning info for log2')
LOG2.error('error:b.c')
LOG2.critical('critical')上例设置了 filter b,则 b.c 为 b 的子 logger,因此满足过滤条件该 logger 相关的日志信息会 被输出,而其他不满足条件的 logger(这里是 d.e)会被过滤掉。清单 13. 输出结果b.c
11:07:29,733 INFO normal infor for log1
11:07:29,733 WARNING warning info for log1:b.c
11:07:29,733 ERROR error info for log1:abcd
11:07:29,733 CRITICAL critical info for log1:not workedlogging 的使用非常简单,同时它是线程安全的,下面结合多线程的例子讲述如何使用 logging 进行 debug。清单 14. 多线程使用 logginglogging.conf
keys=root,simpleExample
[handlers]
keys=consoleHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
code example:
#!/usr/bin/python
import thread
import time
import logging
import logging.config
logging.config.fileConfig('logging.conf')
# create logger
logger = logging.getLogger('simpleExample')
# Define a function for the thread
def print_time( threadName, delay):
logger.debug('thread 1 call print_time function body')
logger.debug('count:%s',count)总结全文介绍了 python 中 debug 的几种不同的方式,包括 pdb 模块、利用 PyDev 和 Eclipse 集成进行调试、PyCharm 以及 Debug 日志进行调试,希望能给相关 python 使用者一点参考。更多关于 python debugger 的资料可以参见参考资料。
相关主题参考
查看 Python 的官方文档。参考
文档获取更多的 logging 使用信息。 在
寻找为 Linux 开发人员(包括 )准备的更多参考资料,查阅我们 。 在 developerWorks 上查阅所有
和 。 随时关注 developerWorks 和。
添加或订阅评论,请先或。
有新评论时提醒我
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Linux, Open sourceArticleID=812901ArticleTitle=Python 代码调试技巧publish-date=在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
标签:至少1个,最多5个
bound与unbound
通常认为实例方法是bound的,而类方法是unbound的,这种说法也没错,只是对于不同类型变量来说,结果是不同的
class A(object):
"""test class"""
_instance = None
def __private(self):
def _protect(self):
def fs(self):
@staticmethod
@classmethod
def fc(cls):
测试一下, 结果显示的都是bound method
&&& a = A()
&bound method A.fs of &__main__.A object at 0x101fa3250&&
&bound method type.fc of &class '__main__.A'&&
直接从类访问,结果fs这个实例方法显示的是unbound。可以知道bound的意义并不是始终不变的,对于不同的对象来说意义并不一样。
&unbound method A.fs&
&bound method type.fc of &class '__main__.A'&&
python里面类方法和实例方法可以等价变换
从描述器的角度看
&&& A.__dict__['fs'].__get__(None, A)
&unbound method A.fs&
&&& A.__dict__['fs'].__get__(a, A)
&bound method A.fs of &__main__.A object at 0x101fa3250&&
&&& A.__dict__['fc'].__get__(None, A)
&bound method type.fc of &class '__main__.A'&&
不过实例a调用静态方法会出错(TypeError),因为实例对方法的调用提供了self参数,但sm是没有参数的。但是这提供了另一种思路)比如在python的多进程编程中,进程跑的函数如果是实例函数的会因为无法序列化而失败,但如果是staticmethod就没有问题,静态函数的本质其实也就是普通函数。所以可以这样
class B(object):
@staticmethod
def run(inst):
inst.foo()
def foo(self):
print 'foo'
在2.x中区分实例函数和类函数可以用im_self
&&& A.fs.im_self
&&& A.fc.im_self
&class '__main__.A'&
至于通过实例引用方法时的im_self的值,大家自己可以探索下
获取类中所有定义的方法
使用dir函数
&&& dir(A)
['_A__private',
'__class__',
'__delattr__',
'__dict__',
'__doc__',
'__format__',
'__getattribute__',
'__hash__',
'__init__',
'__module__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'_instance',
'_protect',
使用inspect.getmembers这个除了函数名的字符串以外,连对象的type也得到了,结果更加详细
&&& inspect.getmembers(A)
[('_A__private', &unbound method A.__private&),
('__class__', type),
('__delattr__', &slot wrapper '__delattr__' of 'object' objects&),
('__dict__',
&dictproxy {'_A__private': &function __main__.__private&,
'__dict__': &attribute '__dict__' of 'A' objects&,
'__doc__': 'test class',
'__module__': '__main__',
'__weakref__': &attribute '__weakref__' of 'A' objects&,
'_instance': None,
'_protect': &function __main__._protect&,
'fc': &classmethod at 0x&,
'fs': &function __main__.fs&,
'sm': &staticmethod at 0x&}&),
('__doc__', 'test class'),
('__format__', &method '__format__' of 'object' objects&),
('__getattribute__', &slot wrapper '__getattribute__' of 'object' objects&),
('__hash__', &slot wrapper '__hash__' of 'object' objects&),
('__init__', &slot wrapper '__init__' of 'object' objects&),
('__module__', '__main__'),
('__new__', &function __new__&),
('__reduce__', &method '__reduce__' of 'object' objects&),
('__reduce_ex__', &method '__reduce_ex__' of 'object' objects&),
('__repr__', &slot wrapper '__repr__' of 'object' objects&),
('__setattr__', &slot wrapper '__setattr__' of 'object' objects&),
('__sizeof__', &method '__sizeof__' of 'object' objects&),
('__str__', &slot wrapper '__str__' of 'object' objects&),
('__subclasshook__', &function __subclasshook__&),
('__weakref__', &attribute '__weakref__' of 'A' objects&),
('_instance', None),
('_protect', &unbound method A._protect&),
('fc', &bound method type.fc of &class '__main__.A'&&),
('fs', &unbound method A.fs&),
('sm', &function __main__.sm&)]
判断某个属性是否可调用
callable(getattr(a, 'testattr', None))
获得一个对象中所有可调用的方法
[method for method in dir(object) if callable(getattr(object, method))]
重写__dict__或者__dir__
class C(object):
__dict__ = {}
def __dir__(self):
return ['cherry']
注意,这里的__dict__不是类的,是实例的,类的__dict__是不可写的,不信可以试试__dir__很奇怪,如果dir函数用在C的实例上,确实会返回['cherry'],但dir(C)还是能得到类中所有属性,有点掩耳盗铃的感觉,待继续研究
3 收藏&&|&&9
你可能感兴趣的文章
1 收藏,471
1 收藏,1.4k
最近刚刚好看到这儿,确实理解起来错中复杂,期待后续的研究
最近刚刚好看到这儿,确实理解起来错中复杂,期待后续的研究
多谢支持:)
多谢支持:)
分享到微博?
我要该,理由是:

我要回帖

更多关于 excel表格新手入门视频 的文章

 

随机推荐