一篇文章彻底搞懂Python类属性和方法的调用

 更新时间:2022年06月26日 09:42:12   作者:若年封尘  
对python 调用类属性的方法详解测试时候类的调用是经常会用到的,下面这篇文章主要给大家介绍了关于Python类属性和方法的调用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。

一、类、对象概述

在面向对象程序设计中,把数据以及对数据的操作封装在一起,组成一个整体(对象),不同对象之间通过消息机制来通信或者同步。对于相同类型的对象进行分类、抽象后,得出共同的特征而形成了类。

类的抽象具体包括两个方面:

1.数据抽象:描述某类对象共有的属性或状态。

2.过程抽象:描述某类对象共有的行为或功能操作。

在python中,使用类来定义同一种类型的对象。类是广义的数据类型,能够定义复杂数据的特性,包括:

1.静态特性(即数据抽象):创建类时用变量形式表示对象特征的成员称为属性(数据成员)。

2.动态特性(即行为抽象,也就是对数据的操作方法):用函数形式表示对象行为的成员称为成员方法,数据成员和成员方法统称为类的成员。

类是实现代码复用和设计复用的一个重要方法,封装、继承、多态是面向对象程序设计的三个要素。

类是生成对象的抽象模板,对象是根据类创建出来的一个个具体的实例。

二、类的定义与使用

Python使用class关键字来定义类,class关键字之后是一个空格,接下来是类的名字,如果派生自其它基类的话则需要把所有父类放到一对圆括号中并使用逗号分隔,然后是一个冒号,最后换行并定义类的内部实现。

类名的首字母一般要大写。

class Car(object):              #定义一个类,派生自object类(所有类的祖先,定义类时不存在其他父类就写object)
	can_move=True               #定义类属性
    def infor(self):            #定义成员方法
        print("This is a car")

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self(self代表类的实例,而非类;self 不是 python 关键字,我们把他换成其他也是可以正常执行的)。

三、类属性和类方法的调用

定义了类之后,就可以用来实例化对象,并通过“对象名.成员”的方式来访问其中的数据成员或成员方法。

>>>spring=Bird()                        #实例化对象
>>>print(Bird.have_feather)             #通过类名调用属性
>>>print(Bird.have_head)                #通过对象名调用属性
>>>spring.move()                        #通过对象名调用方法
>

类方法大体分为 3 类,分别是类方法、实例方法和静态方法,其中实例方法用的是最多的。我们知道,实例方法的调用方式其实有 2种,既可以采用类对象调用,也可以直接通过类名调用。

通常情况下,我们习惯使用类对象调用类中的实例方法。但如果想用类调用实例方法,不能像如下这样:

class Study:
    def info(self):
        print("学 Python")
#通过类名直接调用实例方法
Study.info()

运行上面代码,程序会报出如下错误:

Traceback (most recent call last):
  File "D:\python3.6\demo.py", line 5, in <module>
    Study.info()
TypeError: info() missing 1 required positional argument: 'self'

其中,最后一行报错信息提示我们,调用 info() 类方式时缺少给 self 参数传参。这意味着,和使用类对象调用实例方法不同,通过类名直接调用实例方法时,Python 并不会自动给 self 参数传值。

读者想想也应该明白,self 参数需要的是方法的实际调用者(是类对象),而这里只提供了类名,当然无法自动传值。

因此,如果想通过类名直接调用实例方法,就必须手动为 self 参数传值。例如修改上面的代码为:

class Study:
    def info(self):
        print("学 Python")
clang = Study()
#通过类名直接调用实例方法
Study.info(clang)

再次运行程序,结果为:

学 Python

可以看到,通过手动将 clang 这个类对象传给了 self 参数,使得程序得以正确执行。实际上,这里调用实例方法的形式完全是等价于 clang.info()。

值得一提的是,上面的报错信息只是让我们手动为 self 参数传值,但并没有规定必须传一个该类的对象,其实完全可以任意传入一个参数,例如:

class Study:
    def info(self):
        print(self,"学 Python")
#通过类名直接调用实例方法
Study.info("zhangsan")

运行结果为:

zhangsan 学 Python

可以看到,“zhangsan” 这个字符串传给了 info() 方法的 self 参数。显然,无论是 info() 方法中使用 self 参数调用其它类方法,还是使用 self 参数定义新的实例变量,胡乱的给 self 参数传参都将会导致程序运行崩溃。

总的来说,Python 中允许使用类名直接调用实例方法,但必须手动为该方法的第一个 self 参数传递参数,这种调用方法的方式被称为“非绑定方法”。

用类的实例对象访问类成员的方式称为绑定方法,而用类名调用类成员的方式称为非绑定方法。

四、私有成员与公有成员

  • 私有成员在类的外部不能直接访问,一般是在类的内部进行访问和操作,或者在类的外部通过调用对象的公有成员方法来访问,而公有成员是可以公开使用的,既可以在类的内部进行访问,也可以在外部程序中使用。
  • 从形式上看,在定义类的成员时,如果成员名以两个下划线开头但是不以两个下划线结束则表示是私有成员,否则就不是私有成员。
  • Python并没有对私有成员提供严格的访问保护机制,通过一种特殊方式“对象名._类名__xxx”也可以在外部程序中访问私有成员,但这会破坏类的封装性,不建议这样做。

在Python中,以下划线开头的变量名和方法名有特殊的含义,尤其是在类的定义中。

_xxx:受保护成员;
__xxx__:系统定义的特殊成员;
__xxx:私有成员,只有类对象自己能访问,子类对象不能直接访问到这个成员,但在对象外部可以通过“对象名._类名__xxx”这样的特殊方式来访问。

注意:Python中不存在严格意义上的私有成员。

总结

到此这篇关于Python类属性和方法的调用的文章就介绍到这了,更多相关Python类属性和方法调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现TCP探测目标服务路由轨迹的原理与方法详解

    Python实现TCP探测目标服务路由轨迹的原理与方法详解

    这篇文章主要介绍了Python实现TCP探测目标服务路由轨迹的原理与方法,结合实例形式分析了Python TCP探测目标服务路由轨迹的原理、实现方法及相关操作注意事项,需要的朋友可以参考下
    2019-09-09
  • Python基于Socket实现简单聊天室

    Python基于Socket实现简单聊天室

    这篇文章主要为大家详细介绍了Python基于Socket实现简单聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • 在jupyter notebook 添加 conda 环境的操作详解

    在jupyter notebook 添加 conda 环境的操作详解

    这篇文章主要介绍了在jupyter notebook 添加 conda 环境的操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python复制文件到指定目录的实例

    python复制文件到指定目录的实例

    下面小编就为大家分享一篇python复制文件到指定目录的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python实现的列表排序、反转操作示例

    Python实现的列表排序、反转操作示例

    这篇文章主要介绍了Python实现的列表排序、反转操作,结合实例形式分析了Python针对列表的sort排序、以及基于reverse、切片的反转操作相关实现技巧,需要的朋友可以参考下
    2019-03-03
  • opencv python 傅里叶变换的使用

    opencv python 傅里叶变换的使用

    这篇文章主要介绍了opencv python 傅里叶变换的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • python 获取当天每个准点时间戳的实例

    python 获取当天每个准点时间戳的实例

    今天小编就为大家分享一篇python 获取当天每个准点时间戳的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python测试人员需要掌握的知识

    Python测试人员需要掌握的知识

    很多朋友都想做了个python的测试人员,那么python测试员需要知道的基本知识有哪些呢?跟着小编一起学习下。
    2018-02-02
  • 利用Python网络爬虫爬取各大音乐评论的代码

    利用Python网络爬虫爬取各大音乐评论的代码

    这篇文章主要介绍了如何用Python网络爬虫爬取网易云音乐评论,文章用代码详细的示范了如何爬取网易云音乐评论,对正在学习的小伙伴有参考价值,需要的朋友可以参考下
    2021-04-04
  • 一文详解Python中itertools模块的使用方法

    一文详解Python中itertools模块的使用方法

    itertools是python内置的模块,使用简单且功能强大。这篇文章主要为大家详细介绍了itertools模块的使用方法,感兴趣的小伙伴可以了解一下
    2023-03-03

最新评论