假设我有一个字符串
my_str = "Hello World"
func1 = getattr(__builtins__, 'len')
func1
<built-in function len>
func1()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: len() takes exactly one argument (0 given)
func1(my_str)
11
在func1中,我必须传递 func1 中的 my_str 对象才能获得结果,但如果我做这样的事
func2 = getattr(my_str, 'replace')
func2
<built-in method replace of str object at 0x102d83cc0>
func2()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: replace() takes at least 2 arguments (0 given)
func2("Hello", "Yello")
'Yello World'
这里的func2是my_str对象的 内置方法 ,我不必传递my_str对象。
鉴于2个对象 func1 和 func2 我想知道是他们区分这些对象的方法运行期间有2个功能
答案 0 :(得分:2)
此问题可能比您描述的要复杂得多。函数也可以使用可选参数(提供默认值),可变数量的位置参数(*args
),关键字参数(**kwargs
)。
要检查函数的arg-spec,可以使用inspect.getargspec
:
import inspect
def f(): pass
def g(x): pass
inspect.getargspec(f)
=> ArgSpec(args=[], varargs=None, keywords=None, defaults=None)
inspect.getargspec(g)
=> ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)
这清楚地显示了f
和g
的签名之间的差异。
答案 1 :(得分:1)
如果可以回答以下问题,问题就可以解决。
函数/方法是否是对象的一部分? 在给定的例子中,func1是一个独立的函数,func2是一个&#39; str的方法。对象
&#34; __self__
&#34;属性可以用来回答这个问题。
my_str = "Hello World"
func1 = getattr(__builtins__, 'len')
func1
func1.__self__ # is empty
func2 = getattr(my_str, 'replace')
func2
func2.__self__ # it is non-empty