类方法和对象方法

6.4 类方法和对象方法

方法的本质其实就是函数,在模块中定义就是函数,在类中定义就是类的方法。方法按照归属分类一般有3种:对象方法、类方法、静态方法。

6.4.1 对象方法

class Person:
    cls_attr = '我是类属性'

    def __init__(self):
        self.obj_attr = '我是对象属性'

    def eat(self):
        print('我在吃饭,别烦我。')


zhangsan = Person()
zhangsan.eat()

我在吃饭,别烦我。

在上面的代码中:
我们在用def eat(self):定义了一个函数,而这个函数是在类中定义的,则称为这个类的方法。这个方法内部只有一条命令:print('我在吃饭,别烦我。')。
之前我们已经学会了如何定义一个函数,实际上类中的方法其实就是一个函数,只不过:
1、方法在类的内部定义
2、方法的第一个形参必须要有,通常为self,代表的就是类实例化后的那个对象本身。
3、方法的调用为:对象.方法(参数),在调用时,开发者不需要再手动传入一个实参给前面说的self形参,这个行为是在实例化后自动实现的。而函数的调用方法为:函数名(参数)。
zhangsan.eat():这句代码是执行了zhangsan对象中的eat方法,结果就是执行了定义时的语句:print('我在吃饭,别烦我。')

6.4.2 类方法

如果在定义对象方法前面添加@classmethod的装饰器后,该方法就从对象方法变成了类方法。如下:

class Person:

    def __init__(self):
        self.name = '张三'

    @classmethod
    def eat(cls):
        print('我在吃饭,别烦我。')


zhangsan = Person()
zhangsan.eat()
Person.eat()

我在吃饭,别烦我。
我在吃饭,别烦我。

类方法的第一个参数同对象方法一样,调用时不需要传入,通常形参写成cls。类方法可以通过类名或者实例化后的对象调用。

6.4.3 静态方法

静态方法则是在定义方法时添加了@staticmethod装饰器的方法。

class Person:

    def __init__(self):
        self.name = '张三'

    @staticmethod
    def eat():
        print('我在吃饭,别烦我。')


zhangsan = Person()
zhangsan.eat()

我在吃饭,别烦我。

定义静态方法时,不需要再传入selfcls等特殊的形参,而可以像其它函数一样使用参数定义。实际上,静态方法已经完全就是一个普通函数了。

6.4.4 私有方法

如果在类中定义了以__开头的方法名,表示该方法是一个私有方法,在类的外部是不可以直接访问的。当然,和私有属性一样,还是可以通过_类名方法名进行访问的。而以_开头的方法名也是一样,可以直接在外部访问,但是不建议使用。

class MyClass2:

    def _fun1(self):
        print('fun1')

    def __fun2(self):
        print('fun2')


mc = MyClass2()
mc._fun1()
mc._MyClass2__fun2()
mc.__fun2()

fun1
fun2
Traceback (most recent call last):
File "E:\BaiduNetdiskWorkspace\FrbPythonFiles\study\main.py", line 13, in
mc.__fun2()
AttributeError: 'MyClass2' object has no attribute '__fun2'

6.4.5 对象方法、类方法、静态方法的区别

参数区别:
对象方法:
第一个形参必须是指向对象本身,通常为self,调用时不需要传入对应实参。
类方法:
第一个形参必须是指向类本身,通常为cls,调用时不需要传入对应实参。
静态方法:
形参定义同普通函数一样。
调用属性区别:
对象方法:
可以通过self.的方式(和第一形参对应)调用对象属性,但是不能调用类属性。
类方法:
可以通过cls.的方式(和第一形参对应)调用类属性,但是不能调用对象属性。
静态方法:
不能调用类属性和对象属性。
调用区别:
对象方法:
对象可以直接调用;类也可以调用,前提是对象方法中没有调用对象属性。
类方法:
对象和类都可以调用。无论类方法中有没有调用类属性。
静态方法:
对象和类都可以调用。但是在调用时,静态方法中无法调用对象或类属性。

总结性代码如下,其中会报错的代码就注释掉了:

class Person:
    cls_attr = '我是类属性'

    def __init__(self):
        self.obj_attr = '我是对象属性'

    def eat(self):
        # print(cls_attr)
        print(self.obj_attr)

    @classmethod
    def sleep(cls):
        print(cls.cls_attr)
        # print(self.obj_attr)

    @staticmethod
    def run():
        # print(cls_attr)
        # print(self.obj_attr)
        print('我是静态方法')


zhangsan = Person()
zhangsan.eat()
zhangsan.sleep()
zhangsan.run()
# Person.eat()
Person.sleep()
Person.run()

我是对象属性
我是类属性
我是静态方法
我是类属性
我是静态方法

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:类方法和对象方法 - Python技术站

(0)
上一篇 2023年3月31日 下午8:44
下一篇 2023年3月31日

相关文章

  • 集合(set)

    4.6 集合(set) 集合是由不重复元素组成的无序容器。集合中的元素不能重复,即使向集合中再添加同样的元素,也只会保留一个。由于集合的这种特性,所以一般可以用集合进行去重。集合中不能添加可变对象(不可哈希),因为无法判断两个可变对象是否相同,也就无法保证集合的内部不会有重复元素。集合中的元素是无序的,我们通过print可以显示集合内的元素,但是显示的结果并…

    Python开发 2023年4月2日
    00
  • 函数的特殊使用方式

    5.4 函数的特殊使用方式 5.4.1 匿名函数 所谓匿名函数,即不再使用def语句这样标准形式定义的函数。Python中可以使用lambda关键字来创建匿名函数。用lambda创建的匿名函数的函数体比def定义的函数体要简单。语法如下: lambda [参数1[,参数2],….参数n]]:表达式 lam_sum = lambda arg1, arg2:…

    Python开发 2023年4月2日
    00
  • Python复合语句

    3.6 Python复合语句 复合语句是包含其它语句(语句组)的语句;它们会以某种方式影响或控制所包含其它语句的执行。通常,复合语句会跨越多行,虽然在某些简单形式下整个复合语句也可能包含于一行之内。if、while和for语句用来实现传统的控制流程构造。try语句为一组语句指定异常处理和/和清理代码,而with语句允许在一个代码块周围执行初始化和终结化代码。…

    Python开发 2023年4月2日
    00
  • Python特性

    3.1 Python特性 Python是为可读性设计的,与英语有一些相似之处,并受到数学的影响。比如: Python使用新行来完成命令,而不像通常使用分号或括号的其他编程语言。 Python依赖缩进,使用空格来定义范围;例如循环、函数和类的范围。其他编程语言通常使用花括号或关键字来实现此目的。 Python中没有单个字符,单字符被认为是1个字符的字符串。 对…

    Python开发 2023年4月2日
    00
  • Python运算符

    3.3 Python运算符 运算符用于执行程序代码运算,根据操作数一般分为一元运算符、二元运算符。例如:2+3,其操作数是2和3,而运算符则是+。在Python中运算符可以分为以下几种类型:算术运算符、比较(关系)运算符、赋值运算符、逻辑运算符、位运算符、成员运算符、身份运算符。 3.3.1 算术运算符 +、-、*:分别对应数学中的加减乘,在此不做过多的赘述…

    Python开发 2023年4月2日
    00
  • Python函数

    5.1 函数相关基础概念 5.1.1 函数是什么 函数是指一段可以直接被另一段程序或代码引用的程序或代码。也叫做子程序、(OOP中)方法。一个较大的程序一般应分为若干个程序块,每一个模块用来实现一个特定的功能。所有的高级语言中都有子程序这个概念,用子程序实现模块的功能。在程序设计中,常将一些常用的功能模块编写成函数,放在函数库中供公共选用。开发者要善于利用函…

    Python开发 2023年4月2日
    00
  • Python函数的参数

    5.3 函数参数 示例2中定义的函数虽然能够计算总分数,但是每次计算后的结果是固定的,为了增加函数的灵活性,我们希望在调用函数的时候可以传入一些数据,然后根据传入的数据进行计算。要满足这种需求,就需要在定义函数的时候定义参数。 5.3.1 形参和实参 在编程语言中,函数定义使用的是形参,调用时传入的是实参。形参(parameter),全称为形式参数,不是实际…

    Python开发 2023年4月2日
    00
  • 字典(dict)

    4.7 字典(dict) 字典是Python中一种非常重要的数据类型。字典和之前的列表、元组不同,里面的元素使用键-值对进行存储。通常字典中元素的键由字符串或数字等可哈希数据类型组成。可以把字典想象成一个集合,只不过每个元素都是由键-值对组成。字典中的元素的键是不能重复的。字典中的元素也是无序的,这点和集合一样。可以通过键获取集合中元素的值,并且速度要远快于…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部