Python:实例方法、静态方法和类方法

2020-07-21  本文已影响0人  dex0423

1. 实例方法


>>> class Animal():
...     def eat(self):
...         print("animal eat")
...
...
>>> cat = Animal()
>>> cat.eat()
animal eat

-- 如上所示,eat() 方法就是实例方法,只有在 cat 对 Animal 类进行实例化之后,eat() 方法才能够被调用;

2. 静态方法


>>> class Animal():
...     color = "blue"                        # 创建 Animal 类属性 color,并赋值 "blue"    
...     def __init__(self, language):
...         self.language = language
...     @staticmethod
...     def drink(sth):                                               # 静态方法 drink 操作 sth,sth 与 Animal 类没有任何关系
...         print("animal drink {}".format(sth))
...     @staticmethod
...     def has_color():
...         print("animal has {} color".format(Animal.color))         # 静态方法 has_color 调用 Animal 类属性 color
...     @staticmethod
...     def speak():                                                           
...         print("animal speak {}".format(Animal().language))        # 静态方法 speak 调用实例属性 Animal().language
...
>>>
>>> cat = Animal(language="miaomiao")
>>> cat.drink("water")                 # 成功调用 静态方法 drink 操作对象 "water"
animal drink water
>>> cat.has_color()                    # 成功调用 Animal 类属性 color,但是这种操作很鸡肋,因为不可能所有实例的 color 都是 "blue"
animal has blue color
>>> cat.speak()                        # 调用实例属性 Animal().language 失败,这种操作不符合规范
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 13, in speak
TypeError: __init__() missing 1 required positional argument: 'language'

3. 类方法


>>> class Animal():
...     def __init__(self, language):               # 初始化参数为 language
...         self.language = language
...     @classmethod                                
...     def speak(cls, language):                   # 创建类方法 speak,其返回的是重新被 cls 即类本身处理过的 cls(language)
...         return cls(language)
...     def __str__(self):                          # 这个__str__是魔法方法,其返回的字符串结果是类默认属性,如果去掉这段代码会报错
...         return "animal speak " + self.language
...
>>> cat = Animal(language="miaomiao")               # 实例化一个 cat,并赋予 language 参数 "miaomiao"
>>>
>>> cat_word = cat.speak(language="wangwang gaga")  # cat 调用了类方法 speak(),并重新赋予 language 参数 "wangwang gaga"
>>> print(cat_word)                                  
animal speak wangwang gaga                          # 打印 cat_word,看看小猫说了什么,神奇的一幕出现了,小猫 wangwang gaga 乱叫

-- 在上面的代码中我们发现,尽管我们已经给 cat 实例的 language 参数赋值 "miaomiao",但是由于 speak() 作为静态方法通过 cls(laguage) 对类进行了二次处理,导致 cat.speak(language="wangwang gaga") 的打印结果是 animal speak wangwang gaga,我们得到一个 汪汪嘎嘎 乱叫的 猫。


>>> class Count():                           # 创建一个计数器 Cout 类
...     current_count = 10000                # 类变量 current_count 代表类当前的 【数值】,初始值为 10000
...     def __init__(self, num):             # num 参数记录的是当前的 【次数】
...         self.num = num
...         self.current_count = self.count()         
...     @classmethod
...     def count(cls):                      # 此处定义静态方法 count
...         cls.current_count += 1           # 每次调用当前数值都会 +1
...         return cls.current_count
...     def __str__(self):                   # 这个__str__是魔法方法,其返回的字符串结果是类默认属性,如果去掉这段代码会报错
...         return f"第 {self.num} 次计数:当前数值为 {self.current_count}"
...
>>>
>>> num = 0
>>> while num < 10:
...     print(Count(num))
...     num += 1
...
第 0 次计数:当前数值为 10001
第 1 次计数:当前数值为 10002
第 2 次计数:当前数值为 10003
第 3 次计数:当前数值为 10004
第 4 次计数:当前数值为 10005
第 5 次计数:当前数值为 10006
第 6 次计数:当前数值为 10007
第 7 次计数:当前数值为 10008
第 8 次计数:当前数值为 10009
第 9 次计数:当前数值为 10010

上一篇 下一篇

猜你喜欢

热点阅读