Gus*_*ava 6 python class python-3.x
和平,大家好!我正在使用Python 3.6.3,我发现这样的构造是可能的奇怪:
class TestClass(object):
def __init__(self):
self.arg = "arg"
def test():
print("Hey test")
Run Code Online (Sandbox Code Playgroud)
并使用:
>>> TestClass.test()
"Hey test"
Run Code Online (Sandbox Code Playgroud)
我知道在Python中有标准方法,带有selfas参数(不知道如何正确调用它们),静态方法,类方法,抽象方法.
但是什么样的方法test()呢?这是静态方法吗?
编辑:
在类中确定函数的这种方法是否有任何有用的用例?
Ara*_*Fey 17
在python 3中,函数和类中定义的函数没有区别:
def test():
print("Hey test")
class TestClass:
def test():
print("Hey test")
test() # works
TestClass.test() # also works
Run Code Online (Sandbox Code Playgroud)
这两个都是正常的功能。
self当您通过类的实例访问函数时,隐式参数的魔力就会发生,如下所示:
obj = TestClass()
obj.test() # throws an error because the test function doesn't accept arguments
Run Code Online (Sandbox Code Playgroud)
这是函数 test变成(bound) method 的时候 test。如果您打印它们,您可以看到差异:
print(TestClass.test)
print(instance.test)
# output:
# <function TestClass.test at 0xaaaaaa>
# <bound method TestClass.test of <__main__.TestClass object at 0xbbbbbb>>
Run Code Online (Sandbox Code Playgroud)
把它们加起来:
self参数的方法。有关从函数到绑定方法的这种转换究竟如何工作的详细信息,请参阅描述符 how-to,特别是有关函数的部分。
让我用一个例子来解释:
class TestClass(object):
def __init__(self):
self.arg = "arg"
def test1():
print("class method test1, Hey test")
@classmethod
def test2(cls):
print("class method test2, Hey test")
def test3(self):
print("instance method test3, Hey test")
Run Code Online (Sandbox Code Playgroud)
看看当你用类或实例调用 test1 时会发生什么:
第一的:
TestClass.test1() #called from class
class method test1, Hey test
TestClass().test1() #created an instance TestClass()
Traceback (most recent call last):
File "python", line 1, in <module>
TypeError: test1() takes 0 positional arguments but 1 was given
Run Code Online (Sandbox Code Playgroud)
那是因为当你创建一个实例时,使用了self参数,但在这里,该方法没有 self 参数,这就是它刹车的原因。
下一个!
TestClass.test2()
class method test2, Hey test
TestClass().test2()
class method test2, Hey test
Run Code Online (Sandbox Code Playgroud)
例如,这对课堂有效,为什么?好吧,正如你所看到的 test2(cls) 接受一个参数,cls在这里,我没有使用它,所以,它可以工作。
给我带来下一个主题,muajaja
TestClass().test3()
instance method test3, Hey test
TestClass.test3()
Traceback (most recent call last):
File "python", line 1, in <module>
TypeError: test3() missing 1 required positional argument: 'self'
Run Code Online (Sandbox Code Playgroud)
这很容易看出来,当你把它称为类时,你没有提供self参数
在 Python 3 中,(与 Python 2 不同)从类访问和调用的函数只是另一个函数;没什么特别的:
请注意,每次从实例中检索属性时,都会发生从函数对象到实例方法对象的转换。
[强调我的]
您只是碰巧使用正确的参数集调用函数,尽管是通过类对象访问的。与通过实例调用方法的底层函数对象相同:
TestClass().test.__func__() # "Hey test"
Run Code Online (Sandbox Code Playgroud)
一个快速测试进一步解释了它:
print(TestClass().test is TestClass.test)
# False
print(TestClass().test.__func__ is TestClass.test)
# True
Run Code Online (Sandbox Code Playgroud)
但是,在 Python 2 中,行为是不同的,因为当通过类或实例访问属性时,会发生从函数对象到方法对象的转换:
请注意,每次从类或实例中检索属性时,都会发生从函数对象到(未绑定或绑定)方法对象的转换。
[强调我的]