文章目录
类的实例方法
什么是类的实例方法?
听名字便可不言而喻,只有当被实例化之后,才可以被调用,才可以实现方法体。一般显著特征会带有self参数,因为这是实例方法独有的,为什么这么说呢?因为实例化后会将实例化后的内存地址通过self传进去,来达到调用实例化属性的目的。
代码示例:
class Student(object):
def __init__(self,name):
self.name=name
def information(self):
print("我叫{}".format(self.name))
Student("张三").information()
Student("李四").information()
'''
运行结果:
我叫张三
我叫李四
'''
我们可以揭秘一下调用过程:
首先我们先看第一个类的实例化之后,将张三传入初始化方法(init()方法)里面的name形参并且将这个实例化的地址也传入初始化方法中的self形参,换一句话可以说self是对象实例的引用,形参变实参,执行初始化方法中的语句。执行完毕又调用了information()方法,同样还是传入实例化地址,形参self变实参,执行方法中的语句,调用结束。
那么第二个类的实例化之后跟第一个是大同小异的,只是实例化后的内存地址是不一样的这里就不再详解了。
应用场景:实例方法应用较多,几乎无处不在。
类的静态方法
什么是类的静态方法?
那么带有self的方法是类的实例方法,那么没有带self的方法是什么方法呢?他是类的静态方法。
定义静态方法的方式:
采用修饰符staticmethod,python定义什么修饰符都需要加@,这应该早已成习惯。
应用场景:
一般用于既不需要访问实例属或者调用实例方法,也不需要访问类属性或者调用实例方法,这种情况是存在的。
其实你早都应该见过比如:
class foo:
def instantiation_mathod(self):
#不访问实例属性/类属性
print("这是实例方法")
foo().instantiation_mathod()
'''
运行结果:
这是实例方法
'''
总结:哈哈!这下你总算知道了把,原来这就是应用场景啊!这不是实例方法吗?是的,这是实例方法,但是他并没有进行传参,所以完全可以定义成静态方法。在pycharm中定义如上代码,pycharm会提示你定义成静态方法。以便不用实例化,直接调用。
代码示例:
class foo:
@staticmethod
def static_mathod():
#不访问实例属性/类属性
print("这是静态方法")
foo.static_mathod()
# 不推荐使用
foo().static_mathod()
'''
运行结果:
这是静态方法
这是静态方法
'''
结论:注意跟实例方法不同的是,不传递self参数,可以不通过实例化直接通过类名.方法名()调用,也可以通过实例化后通过类名().方法名调用,但是这种调用失去了意思,如果实例化后了,调用方法,那么申明成静态方法的意义何在呢?
类方法
什么是类方法?
实例化之后的类中的方法都是在实例中运行,那么如果说
就要用到类方法。
定义类方法的方式:
在方法上面添加装饰器@classmethod来修饰
使用场景:
当一个方法只涉及到静态属性的时候可以使用类方法:
代码示例:
class fruit():
__discount=1
def __init__(self,name,price):
self.name=name
self.__price=price
def price(self):
return "水果名:{},价格:{}/斤".format(self.name,self.__price*self.__discount)
@classmethod
def fruit_discount(cls,new_discount):
cls.__discount=new_discount
fruit.fruit_discount(0.8)
print(fruit("苹果", 18).price())
print(fruit("香蕉",20).price())
'''
运行结果:
水果名:苹果,价格:14.4/斤
水果名:香蕉,价格:16.0/斤
'''
结论:在上述案例中,我们将设置折扣重新定义了一个类,并且加上装饰器@classmethod,不用实例化后就能调用。有的人可能没理解,认为类方法没什么用。因为类方法能够左右实例方法,这意味着只用 调用一次类方法,实例方法中的折扣早已改变。
那么这三者有什么区别呢?
实例方法、类方法、静态方法的区别:
这三种方法都是保存在类的内存中,调用者不同。
实例方法由对象调用,至少一个self参数,self代表对象的引用。
类方法由类调用,至少一个cls参数,并且需要装饰器@classmethod修饰
静态方法由类调用,不需要参数,需要装饰器@staticmethod修饰
来一波,推送吧!
群号:781121386
群名:人生苦短,我学编程
欢迎大家加入我们,一起交流技术!!!