Python笔记_第三篇_面向对象_2.构造函数和析构函数(含self说明)

时间:2021-10-26 04:55:49

1. 构造函数

  为什么要有构造函数

  打一个比方:类的创建就是好比你创建了好了一种格式的房间,你租给上一个住户的后,里面会对方很多“垃圾”和不规则的物品摆放。构造函数就是下一个住户再使用的时候进行物品的初始化摆放,防止下一个用户再使用的时候会出现没有初始化物品错放的错误等。

  构造函数的格式:

  __init__( ):

  注意:在使用创建对象的时候会自动调用,构造函数用于初始化类实例的状态。如果不显式的创建构造函数,默认会自动添加一个构造函数。其实由于没有本身都会带上这个构造函。但是还是要写上比较好。

  举例说明:

class Person(object):
def __init__(self,name,age,height,weight):
print(name,age,height,weight)
self.name = name
self.age = age
self.height = height
self.weight = weight
def run(self):
print("run")
def eat(self,food):
print("eat " + food) per3 = Person("hanmeimei",,,)
print(per3.name,per3.age,per3.height,per3.weight)
# hanmeimei
# hanmeimei per4 = Person("lilei",,,)
print(per4.name,per4.age,per4.height,per4.weight)
# lilei
# lilei

2. 析构函数

  为什么要有析构函数

    之前我们在第一篇关于内存详细解析的时候说过,在高级的语言类似于C/C++、java等不需要手动的去释放内存。在这类语言当中有自动的内存管理机制。其实析构函数就是释放类在调用后的一种内存释放作用。因此我们释放内存常用的一共有四种,释放类的内存,释放实例化的内存,释放函数内存,释放变量内存。析构函数就是释放类的内存的一种方式,但是我们有自动化的内存释放机制,这种方式一般我们也不太写。

  格式:

  __del__( )

  举例说明:

# 第一种释放
class Person(object):
def __init__(self,name,age,height,weight):
self.name = name
self.age = age
self.height = height
self.weight = weight
def __del__(self):
print("这里是析构函数")
def run(self):
print("run")
def eat(self,food):
print("eat " + food)
def say(self):
print("Hello! My name is %s, I am %d years old" %(self.name,self.age)) per5 = Person("hanmeimei",,,)
# 第二种释放
del per5 # 对象释放后就不能在访问了 # 第三种释放:在函数里定义的对象,会在函数结束时自动释放,这样可以用来减少内存空间的浪费。
def func():
perx = Person("aa",,,) func()

3. self说明

  我们发现,在类的列表中有一个object的父类。在属性和方法的编写的时候出现了self的这个东西。这个东西就是一种“自身限制”的作用。解释如下:  

  self:表示类的实例,而非类。那个对象调用方法,那么该方法中的self代表那个对象。

  self.__class__:代表类名。

  self.表示调用自身类。表示当前实例的引用。意思是:他只能被用在下列类成员的代码块中

  self的目的:

    用于区分类的成员和本地的变量或参数。

    作为调用方法的实参。

  self类似于C# 语言中的this.的意思

  举例说明:

class Person(object):
def __init__(self,name,age,height,weight):
# print(name,age,height,weight)
self.name = name
self.age = age
self.height = height
self.weight = weight def run(self):
print("run")
def eat(self,food):
print("eat " + food)
def say(self):
print("Hello! My name is %s, I am %d years old" %(self.name,self.age))
# self不是关键字,换成其他的标识符也是可以的,但是帅的人一般都用self per = Person("Tom",,,)
per.say()

4.cls说明

  Self表示一个具体的实例本身。如果用了staticmethod(静态方法),那么饥渴五十这个self,把这个方法当成一个普通使用。

  cls表示这个类本身,常用用在返回这个类的方法或者属性的类型和信息信息。

>>> class A(object):
def foo1(self):
print "Hello",self
@staticmethod
def foo2():
print "hello"
@classmethod
def foo3(cls):
print "hello",cls >>> a = A() >>> a.foo1() #最常见的调用方式,但与下面的方式相同
Hello <__main__.A object at 0x9f6abec> >>> A.foo1(a) #这里传入实例a,相当于普通方法的self
Hello <__main__.A object at 0x9f6abec> >>> A.foo2() #这里,由于静态方法没有参数,故可以不传东西
hello >>> A.foo3() #这里,由于是类方法,因此,它的第一个参数为类本身。
hello <class '__main__.A'> >>> A #可以看到,直接输入A,与上面那种调用返回同样的信息。
<class '__main__.A'>
---------------------
作者:daijiguo
来源:CSDN
原文:https://blog.csdn.net/daijiguo/article/details/78499422
版权声明:本文为博主原创文章,转载请附上博文链接!

Python笔记_第三篇_面向对象_2.构造函数和析构函数(含self说明)的更多相关文章

  1. Python笔记&lowbar;第三篇&lowbar;面向对象&lowbar;4&period;单下划线和双下划线

    说道这里我们需要稍微暂停一下.前面我们说到了类是作为一个对象存放容器.这个容器里面有属性和方法.最好的理解类的方式就是把类想想成一个容器. 然后构造了一个析构函数和构造函数,然后又对object和se ...

  2. Python笔记&lowbar;第三篇&lowbar;面向对象&lowbar;2&period;第一个Python类

    1. 设计一个类: 设计一个类主要从三个方面进行考虑: 第一:类名:类名要见名知意.首字母大写. 第二:属性. 第三:方法. 备注:在Python中有些东西并不是绝对化的事情,有些根据Python社区 ...

  3. Python笔记&lowbar;第三篇&lowbar;面向对象&lowbar;9&period;Python中的&quot&semi;get&quot&semi;和&quot&semi;set&quot&semi;方法&lpar;&commat;property和&commat;&period;setter&rpar;

    1. 限制访问的问题: 如果学过C# 语言的我们可以知道C# 语言有get和set方法.我们之前想要获取父类中的私有变量,只能通过写一个set和get的函数进行访问或者通过类生成的新关键字来访问私有属 ...

  4. Python笔记&lowbar;第三篇&lowbar;面向对象&lowbar;1&period;面向对象的基本概念和作用域

    1. 软件编程的实质: 软件编程就是将我们的思维转变成计算机能够识别语言的一个过程.重要的是思想,代码技术反而次要.因此思想也是最难的,突破固定的思想是关键 2. 什么是面向过程: * 自上而下顺序执 ...

  5. Python笔记&lowbar;第三篇&lowbar;面向对象&lowbar;5&period;一个关于类的实例&lpar;人开枪射击子弹&rpar;

    1. 我们学了类的这些东西,用这些类我们来操作一个关于类的实例. 2. 题目:人开枪射击子弹,然后具有装弹动作,然后再开枪. 第一步:设计类: 人类名:Person属性:gun行为:fire,fill ...

  6. Python笔记&lowbar;第三篇&lowbar;面向对象&lowbar;3&period;重载&lpar;overloading&rpar;和重写&lpar;overriding&rpar;

    1. 重载: overloading:就是将函数重新定义一遍. 1.1 __str__( )和__repr__( )的重载: 格式: __str__( ):在调用print打印对象时自动调用,是给用户 ...

  7. Python笔记&lowbar;第三篇&lowbar;面向对象&lowbar;8&period;对象属性和类属性及其动态添加属性和方法

    1. 对象属性和类属性. 我们之前接触到,在类中,我们一般都是通过构造函数的方式去写一些类的相关属性.在第一次介绍类的时候我们把一些属性写到构造函数外面并没有用到构造函数,其实当时在写的时候,就是在给 ...

  8. Python笔记&lowbar;第三篇&lowbar;面向对象&lowbar;7&period;多态

    1. 多态的概念 多态:一种事物的多种形态.其表现形式就是连续的继承关系. 还以人喂食动物的例子.最终目标是人可以喂食任何一种动物.如果人要喂食100多种动物,难道要写100中方法吗?多态就是把属性和 ...

  9. Python笔记&lowbar;第三篇&lowbar;面向对象&lowbar;6&period;继承&lpar;单继承和多继承&rpar;

    1. 概念解释: 继承:有两个类:A类和B类.那么A类就拥有了B类中的属性和方法. * 例如:Object:是所有类的父亲,还可以成为基类或者超类(super()) * 继承者为子类,被继承者成为父类 ...

随机推荐

  1. vector&period;end&lpar;&rpar; 指向的节点

    存储器vector, vector.end() 指向的是最后的结束符,而不是最后一个元素.

  2. DLL与EXE之间的通讯调用 以及 回调函数的线程执行空间

    dll 与 exe 之间的通讯方式有很多种, 本文采用回调函数的方法实现, 本文也将研究多线程,多模块的情况下,回调函数所在的线程, 啥也不说了,先附上代码: 下面的是dll模块的的, dll的工程文 ...

  3. freemarker导出word带图片

    导出word带图片 如果你需要在word中添加图片,那你就在第一步制作模板时,加入一张图片占位,然后打开xml文档,可以看到如下的一片base64编码后的代码: <w:binData w:nam ...

  4. &period;NET&lpar;C&num;&rpar;连接各类数据库代码-集锦

    1.C#连接连接Access 复制代码代码如下: using System.Data;   using System.Data.OleDb;   ..   string strConnection=& ...

  5. springboot~使用docker构建gradle项目

    这是一篇关系到四个知识点的文章,分别是java,docker,springboot和gradle,我们希望在java环境下,使用springboot框架,通过gradle去构建项目,然后把项目部署和运 ...

  6. Java的动手动脑(七)

    日期:2018.11.18 博客期:025 星期日 Part 1:使用 Files.walkFileTree()来找出指定文件夹下大小大于1KB的文件 package temp; import jav ...

  7. opencv3 学习笔记(二)

    1.OpenCv 颜色追踪 import cv2import numpy as npcap=cv2.VideoCapture(0)cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1 ...

  8. python day16--面向对象(01)

    一.概念 类:具有相同属性的一类事物 比如人类是类,人类中的某个人是对象.食物是一类,米饭是一个对象 class Person: '''类体:两部分:变量部分,方法(函数)部分''' mind = ' ...

  9. opencv画出轮廓外接矩形

    Mat cannyImage; /// Detect edges using canny Canny(src, cannyImage, , , ); vector<vector<Point ...

  10. Ettercap之ARP&plus;DNS欺骗

    1.网络攻击拓扑环境 网关:192.168.133.2 攻击者:192.168.133.128 受害者:192.168.133.137 2.原理讲解 ARP欺骗 简介:ARP(Address Reso ...