python中@staticmethod、@classmethod和实例方法

1.形式上的异同点:

在形式上,Python中:实例方法必须有self,类方法用@classmethod装饰必须有cls,静态方法用@staticmethod装饰不必加cls或self,如下代码所示:

 1 class A(object):
 2     def __init__(self, name):
 3         self.name = name
 4
 5     def get_a_object(self):
 6         return "get object method:{}".format(self.name)
 7
 8     @staticmethod
 9     def get_b_static():
10         return "get static method"
11
12     @classmethod
13     def get_c_class(cls):
14         return "get class method"
15
16
17 a = A(name="method")
18 print("{} by object method".format(a.get_a_object()))
19 try:
20     print(A.get_a_object())
21 except Exception:
22     print("Class can not call the instance method directly by class method")
23 print("{} by class method".format(A.get_b_static()))
24 print("{} by object method".format(a.get_b_static()))
25 print("{} by class method".format(A.get_c_class()))
26 print("{} by object method".format(a.get_c_class()))

执行结果:

get object method:method by object method
Class can not call the instance method directly by class method
get static method by class method
get static method by object method
get class method by class method
get class method by object method

从执行结果可以看出,实例方法必须实例化后调用不可用类点方法直接调用,静态方法和类方法既可以用实例点方法调用也可用类点方法直接调用

2.应用场景及本质上的异同点

对于应用场景上异同点主要是比较类方法和静态方法,先看一段代码:

 1 class Date:
 2     def __init__(self, year, month, day):
 3         self.year = year
 4         self.month = month
 5         self.day = day
 6
 7     @staticmethod
 8     def today_static():
 9         t = time.localtime()
10         return Date(t.tm_year, t.tm_mon, t.tm_mday)
11
12     @classmethod
13     def today(cls):
14         t = time.localtime()
15         return cls(t.tm_year, t.tm_mon, t.tm_mday)
16
17
18 class NewDate(Date):
19     pass
20
21 date = Date(2018, 12, 31)
22 new_data = NewDate(2018,12,31)
23
24 print("class method -------------")
25 print(date.today().__class__)
26 print(Date.today().__class__)
27 print(NewDate.today().__class__)
28 print(new_data.today().__class__)
29 print("\n")
30 print("static method ------------")
31 print(date.today_static().__class__)
32 print(Date.today_static().__class__)
33 print(NewDate.today_static().__class__)
34 print(new_data.today_static().__class__)
Date类有year、month、day三个属性,静态方法today_static,类方法today,NewDate类继承于Date,分别打印调用类方法和静态方法时属于哪个类
class method -------------
<class ‘__main__.Date‘>
<class ‘__main__.Date‘>
<class ‘__main__.NewDate‘>
<class ‘__main__.NewDate‘>

static method ------------
<class ‘__main__.Date‘>
<class ‘__main__.Date‘>
<class ‘__main__.Date‘>
<class ‘__main__.Date‘>

通过结果可以看出:对于类方法today,调用Date.today()时cls=Date,调用NewDate.today()时,cls=NewDate,cls跟随调用类的变化而变化;对于静态方法today_static,指定了Date(t.tm_year, t.tm_mon, t.tm_mday),所以所属的类始终是Data,如果将Date改为:

class Date1:
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

此时对于@classmethod不会有任何变化,但是对于@staticmethod 如果today_static 返回值不是Date1(t.tm_year, t.tm_mon, t.tm_mday),则会报错

原文地址:https://www.cnblogs.com/FG123/p/9683510.html

时间: 2024-10-10 04:41:04

python中@staticmethod、@classmethod和实例方法的相关文章

python中staticmethod classmethod及普通函数的区别

staticmethod 基本上和一个全局函数差不多,只不过可以通过类或类的实例对象 (python里光说对象总是容易产生混淆, 因为什么都是对象,包括类,而实际上 类实例对象才是对应静态语言中所谓对象的东西)来调用而已, 不会隐式地传入 任何参数.这个和静态语言中的静态方法比较像. classmethod 是和一个class相关的方法,可以通过类或类实例调用, 并将该class对象(不是class的实例对象)隐式地 当作第一个参数传入. 就这种方法可能会比较奇怪一点,不过只要你搞清楚了pyth

python中 staticmethod与classmethod

原文地址https://blog.csdn.net/youngbit007/article/details/68957848 原文地址https://blog.csdn.net/weixin_35653315/article/details/78165645 原文地址https://www.cnblogs.com/1204guo/p/7832167.html 在Python里, 在class里定义的方法可以大致分为三类: 实例方法, 类方法与静态方法. 用一个表格总结如下: 方法类型 修饰 调用

python 类中staticmethod,classmethod,普通方法

1.staticmethod:静态方法和全局函数类似,但是通过类和对象调用. 2.classmethod:类方法和类相关的方法,第一个参数是class对象(不是实例对象).在python中class也是一个真实存在于内存中的对象,不同于其他语言只存在于编译期间. 3.普通方法和实例相关的方法,通过类实例调用. 4.代码示例 #coding:utf-8 ''' Created on 2015年5月29日 @author: canx ''' class Person: def __init__(se

Python中的类方法、实例方法、静态方法

类方法 @classmethod 在python中使用较少,类方法传入的第一个参数是 cls,是类本身: 类方法可以通过类直接调用或者通过实例直接调用,但无论哪种调用方式,最左侧传入的参数一定是类本身. 通常情况下,类方法使用 @classmethod 装饰器来声明 实例方法 实例方法需要将类实例化后调用,如果使用类直接调用实例方法,需要显式的将实例作为参数传入:使用实例调用则不需要. 最左侧传入的参数 self,是实例本身. 静态方法 @staticmethod 指类中无需实例参与即可调用的方

Python @staticmethod, @classmethod, @property

@staticmethod, @classmethod, @property 用法及作用 class Foo(object) : def __init__(self) : self._name = "property test" print "init" def test(self) : print "class method" @property def name(self) : return self._name @staticmethod

python中staticmethod的作用

python中的staticmethod 主要是方便将外部函数集成到类体中, 美化代码结构, 重点在可以不需要类实例化的情况下调用方法 如果去掉staticmethod,在方法中加self也可以通过实例化访问方法也是可以集成代码 1. 不使用staticmethod的代码如何写的: IND = 'ON' def checkind(): return (IND== 'ON') class Kls(object): def __init__(self, data): self.data = data

Python 中的 classmethod 和 staticmethod

类中最常用的方法是实例方法, 即通过通过实例作为第一个参数的方法. 举个例子,一个基本的实例方法就向下面这个: class Kls(object): def __init__(self, data): self.data = data def printd(self): print(self.data) ik1 = Kls('arun') ik2 = Kls('seema') ik1.printd() ik2.printd() 这会给出如下的输出:arunseema 然后看一下代码和示例图片:

Python中@staticmethod和@classmethod的作用和区别

相同之处:@staticmethod 和@classmethod 都可以直接类名.方法名()来调用,不用在示例化一个类. @classmethod 我们要写一个只在类中运行而不在实例中运行的方法.如果我们想让方法不在实例中运行,可以这么做: def iget_no_of_instance(ins_obj): return ins_obj.__class__.no_inst class Kls(object): no_inst = 0 def __init__(self): Kls.no_inst

Python中的classmethod与staticmethod

首先,这是一个经典的问题. 我们首先做一个比较: classmethod的第一个参数是cls,即调用的时候要把类传入 这意味着我们我们可以在classmethod里使用类的属性,而不是类的实例的属性(显式创建可用) staticmethod,调用的时候没有参数,即调用的时候我们不传入东西(类,类的实例) 这意味着我们在staticmethod里无法得到类的实例(显式创建可用) 而我们调用类的普通方法的时候,要把self传进去 这意味着在这个普通方法里,我们只能使用类的实例(self)的属性方法