浅谈python中的实例⽅法self、类⽅法cls和静态⽅法
在学习python代码时,看到有的类的⽅法中第⼀参数是cls,有的是self,经过了解得知,python并没有对类中⽅法的第⼀个参数名字做限制,可以是self,也可以是cls,不过根据⼈们的惯⽤⽤法,self⼀般是在实例⽅法中使⽤,⽽cls则⼀般在类⽅法中使⽤,在静态⽅法中则不需要使⽤⼀个默认参数,其实这个默认参数可以换成任何⼀个名字代替,不会产⽣任何影响。
在下⾯的代码中,InstanceMethod类的⽅法中,第⼀个参数是默认的self,在这⾥可以把self换成任何名字来表⽰,不会有任何影响。
class InstanceMethod(object):
pass
滑块滑轨应用什么原理def __init__(self, a):
self.a = a
def f1(self):
print 'This is {0}.'.format(self)
站酷的素材可以免费使用吗
# def f2(self,a):
def f2(qq,a):
print 'Value:{0}'.format(a)
print qq.apython基础代码实例
if __name__ == '__main__':
pass
# im = InstanceMethod()
im = InstanceMethod('233')
im.f1()
#im.f2()
im.f2(233)
结果:
This is <__main__.InstanceMethod object at 0x100274090>.
Value:233
233
静态⽅法和类⽅法都需要使⽤修饰器,分别使⽤的是staticmethod和classmethod。静态⽅法是和类没有关系的,我觉得就是包装在类中的⼀般⽅法,如下例⼦中,调⽤静态⽅法使⽤实例和不使⽤实例都是可以的。类⽅法中,默认的第⼀个参数使⽤的是cls,类⽅法也可以不需要实例⽽直接使⽤类调⽤。对于这三种不同的⽅法,使⽤⽅法如下例所⽰。那么问题来了,既然有了实例⽅法,类⽅法和静态⽅法与之相⽐⼜有什么好处呢?
在类⽅法中,不管是使⽤实例还是类调⽤⽅法,都会把类作为第⼀个参数传递进来,这个参数就是类本⾝。如果继承了这个使⽤类⽅法的类,该类的所有⼦类都会拥有了这个⽅法,并且这个⽅法会⾃动指向⼦类本⾝,这个特性在⼯⼚函数中是⾮常有⽤的。静态⽅法是和类与实例都没有关系的,完全可以使⽤⼀般⽅法代替,但是使⽤静态⽅法可以更好的组织代码,防⽌代码变⼤后变得⽐较混乱。类⽅法是可以替代静态⽅法的。静态⽅法不能在继承中修改。
在类调⽤的时候,需要满⾜参数的个数要求(参数中含有*args是例外),类调⽤没有参数的时候,会提⽰错误。同样,实例⽅法的参数个数也应该满⾜要求,例如16⾏中也会报错。实例⽅法的⼀个主要特点就是需要绑定到⼀个对象上,python解析器会⾃动把实例⾃⾝传递给⽅法,如14⾏所⽰,⽽直接使⽤InstanceMethod.f1()调⽤⽅法是不⾏的。
class test(object):
#def instance_method(qqq):
#    print 'This is {0}'.format(qqq)
#    print type(qqq),"222222222222"
def instance_method(self):
print 'This is {0}'.format(self)
print type(self),"222222222222"
@staticmethod
def static_method():
print 'This is static method.'
@classmethod
#def class_method(ppp):
#print 'This is {0}'.format(ppp)
def class_method(cls):
print 'This is {0}'.format(cls)
if __name__ == '__main__':
a = test()
a.instance_method()
a.static_method()
a.class_method()
#test.instance_method()
test.static_method()
test.class_method()
结果:
This is <__main__.test object at 0x10d149150> <class '__main__.test'> 222222222222
execution和executiveThis is static method.
java实现多态的两种方法This is <class '__main__.test'>
hibernate缓存事务范围
This is static method.
This is <class '__main__.test'>
Process finished with exit code 0

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。