classmethod和staticmethod区别

  1. python 类语法中有三种方法,实例方法,静态方法,类方法。

普通实例方法,第一个参数需要是self,它表示一个具体的实例本身。

如果用了staticmethod,那么就可以无视这个self,而将这个方法当成一个普通的函数使用。

而对于classmethod,它的第一个参数不是self,是cls,它表示这个类本身。

 

实例方法,第一个参数必须要默认传实例对象,一般习惯用self。必须要实例化。
静态方法,参数没有要求。可以实例化也可以不实例化。

类方法,第一个参数必须要默认传类,一般习惯用cls。可以实例化也可以不实例化。

# -*- coding: utf-8 -*-
"""
Created on Sat May 25 19:42:21 2019

@author: dongyang
"""

# coding:utf-8
class A(object):
    """类三种方法语法形式"""
 
    def instance_method(self):
        print("是类{}的实例方法,只能被实例对象调用".format(A))
 
    @staticmethod
    def static_method():
        print("是静态方法")
 
    @classmethod
    def class_method(cls):
        print("是类方法")
 
B= A()
B.instance_method()
B.static_method()
B.class_method()
print('----------------')
A.static_method()
A.class_method()

 

结果:

是类<class '__main__.A'>的实例方法,只能被实例对象调用
是静态方法
是类方法
----------------
是静态方法
是类方法

 

2.类⽅法的用途

类⽅法⼀个⽤途就是可以对类属性进⾏修改在⽤类⽅法对类属性修改之后,通过类对象和实例对象访问都发⽣了改变

类⽅法的第⼀个参数是类对象cls,那么通过cls引⽤的必定是类对象的属性和⽅法;⽽实例⽅法的第⼀个参数是实例对象self,那么通过self引⽤的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更⾼。静态⽅法中不需要额外定义参数,因此在静态⽅法中引⽤类属性的话,必须通过类对象来引⽤。

# -*- coding: utf-8 -*-
"""
Created on Sat May 25 19:59:31 2019

"""

class People(object):
    country = 'china'
    @classmethod
    def getCountry(cls):
        return cls.country
    @classmethod
    def setCountry(cls,country):
 
        cls.country = country
p = People()
print(p.getCountry())  #可以⽤过实例对象引⽤
print(People.getCountry())  #可以通过类对象引⽤
p.setCountry('japan')
print(p.getCountry())
print(People.getCountry())

结果:

china
china
japan
japan

3.静态⽅法

静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作。可以理解为将静态方法存在此类的名称空间中。事实上,在python引入静态方法之前,通常是在全局名称空间中创建函数。

 

4.区别

 

Staticmethod 无法访问类属性,实例属性

Classmthod  可以访问类属性,无法访问实例属性

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值