python中如何写类
作者:silencement 发布时间:2023-09-02 18:19:58
类的定义
Python中,定义类是通过class关键字,例如我们定义一个存储学生信息的类:
class Student(object):
pass
class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的。通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。
定义好了Student类,就可以根据Student类创建出Student的实例,创建实例是通过类名+()实现的:
>>> bart = Student()
>>> bart
<__main__.Student object at 0x10a67a590>
>>> Student
<class '__main__.Student'>
可以看到,变量bart指向的就是一个Student的实例,后面的0x10a67a590是内存地址,每个object的地址都不一样,而Student本身则是一个类。
可以自由地给一个实例变量绑定属性,比如,给实例bart绑定一个name属性:
>>> bart.name = 'Bart Simpson'
>>> bart.name
'Bart Simpson'
这点与静态语言,比如C++是不一样的。我们可以随时给一个对象添加属性。
在python中,类的属性就等同于c++类的成员变量,类的方法等同于c++类的成员函数。
由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的init方法,在创建实例的时候,就把name,score等属性绑上去:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
对比c++,__init__函数就等同于c++类得构造函数,注意:特殊方法“init”前后有两个下划线。
注意到init方法的第一个参数永远是self,表示创建的实例本身,因此,在init方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
有了init方法,在创建实例的时候,就不能传入空的参数了,必须传入与init方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去:
>>> bart = Student('Bart Simpson', 59)
>>> bart.name
'Bart Simpson'
>>> bart.score
59
和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数、关键字参数和命名关键字参数。
我们可以给我们定义的Student类增加新的方法,比如get_grade:
class Student(object):
...
def get_grade(self):
if self.score >= 90:
return 'A'
elif self.score >= 60:
return 'B'
else:
return 'C'
知识点扩展:
构建和初始化
相信大家都熟悉这个最基础的神奇方法 __ init__。它令你能自定义一个对象的初始化行为。而当我调用x=SomeClass() 时,__ init__ 并不是最先被调用的。实际上有一个叫做 __ new__ 的方法,事实上是它创建了实例,它传递任何参数给初始化程序来达到创建的目的。在对象生命周期结束时,调用 __ del__。让我们更近地观察下这 3 个神奇方法吧:
__ new__(cls,[...)
一个对象的实例化时 __ new__ 是第一个被调用的方法。在类中传递其他任何参数到 __ init__。__new__很少被使用,这样做确实有其目的,特别是当一个子类继承一个不可改变的类型(一个元组或一个字符串)时。我不打算再继续深入追求 __ new __ 的细节了,因为这不会产生多大用处,因为在 Python Docs 内已经涵盖了一份巨详细的说明了。
__ init__(self,[...)
类的初始化。它会获得初始构建调用传过来的任何东西(举例来说就是,当我们调用x=SomeClass(10,'foo'),__ init__ 就会把传过来的 10 和 'foo' 作为参数。__init__在 Python 的类定义中几乎普遍被使用)
__ del__(self)
如果 __ new__和 __ init__ 是对象的构造器,那么 __ del__ 就是析构器。它不实现声明为del x(这样的代码不会解释成 x.__ del__())的行为。相反,它定义为当一个对象被垃圾回收时的行为。这可能对可能需要额外清理的对象相当有用,比如 sockets 或文件对象。但要小心,如果对象仍处于存活状态而当被解释退出时,__ del__ 没有保证就会被执行,因此这样的__ del__ 不能作为良好的编码规范的替代。(就像当你完成操作总是要关闭一次连接。但事实上,__ del__ 几乎永远不会执行,就因为它处于不安全情况被调用了。使用时保持警惕!)
来源:https://www.py.cn/faq/python/13163.html


猜你喜欢
- 第一步、导入需要的包import osimport scipy.io as sioimport numpy as npimport torc
- Python中支持Convex Optimization(凸规划)的模块为CVXOPT,其安装方式为:pip install cvxopt一
- python使用函数改变list函数内改变外部的一个list如果这么写def rotate(nums, k): l
- 为了更好的理解邮件发送功能的实现,要先了解邮件发送系统的大致流程。首先 电子邮件之间的相互发送接受就像 邮局邮件发送
- match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配, 也就是说match()只
- 基于微信开放的个人号接口python库itchat,实现对微信好友的获取,并对省份、性别、微信签名做数据分析。效果:直接上代码,建三个空文本
- AXObject可用来解决IE需要激活 ActiveX 控件和生成控件调用代码 AXObjec
- 前言动态语言Ruby、Python都有自己的虚拟环境,虚拟环境是程序执行时的独立执行环境,在同一台服务器中可以创建不同的虚拟环境供不同的系统
- 前言这次开发微信抢票程序中,普通用户的身份是由微信管理的。当用户通过微信公众号(测试号)向后台发消息时,微信会将用户的身份标记为一个uniq
- python3 shelve模块的详解一、简介在python3中我们使用json或者pickle持久化数据,能dump多次,但只能load一
- stdClass类是PHP的一个内部保留类,初始时没有成员变量也没成员方法,所有的魔术方法都被设置为NULL,可以使用其传递变量参数,但是没
- 1.%格式符name = '李四'age = 18a = "姓名:%s,年龄:%s"%(name,age
- 本文实例讲述了mysql索引对排序的影响。分享给大家供大家参考,具体如下:索引不仅能提高查询速度,还可以添加排序速度,如果order by
- vue2 和vue3 在 rollup 里面打包会存在几种问题, 包版本的问题,babel 转换jsx等问题将vue2写的组件 打成一个包,
- 首先这个bak文件是SQL数据库的备份文件,要使用SQL恢复然后就可以查询了找到需要的文件注意解压出来有7GB+1、下载SQL server
- 数据库发生阻塞和死锁的现象:一、数据库阻塞的现象:第一个连接占有资源没有释放,而第二个连接需要获取这个资源。如果第一个连接没有提交或者回滚,
- 1. 概述每个 Vue 实例在被创建之前都要经过一系列的初始化过程。例如需要设置数据监听、编译模板、挂载实例到 DOM、在数据变化时更新 D
- python是支持多线程的,主要是通过thread和threading这两个模块来实现的。thread模块是比较底层的模块,threadin
- 简介在Python开发和测试过程中主要有两种模式可以选择:脚本模式、命令行模式。在代码的开发和调试过程中使用脚本模式很方便,目前比较主流的命
- 排查原因,发现是80端口被其它程序占用(很常见的事情╮(╯_╰)╭)。解决方法用记事本打开目录x:\xampp\apache\conf下的h