一文带你搞懂python中什么是实例方法,什么是类方法,什么是静态方法!!!

类的实例方法

什么是类的实例方法
听名字便可不言而喻,只有当被实例化之后,才可以被调用,才可以实现方法体。一般显著特征会带有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
群名:人生苦短,我学编程
欢迎大家加入我们,一起交流技术!!!

发布了38 篇原创文章 · 获赞 128 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/lujiangyang123/article/details/103658914
今日推荐