一、魔法方法

1、魔法方法总是被双下划线包围,例如:__init__

2、为什么在类实例化的时候,有时候需要构造__init__,有时候不需要呢

举例说明:
#定义一个矩形的类,需要长和宽两个参数,计算矩形的周长和面积
#我们需要对象在初始化的时候拥有长和宽两个参数,因此我们需要重写__init__方法 In []: class Rectangle:
...: def __init__(self,x,y):
...: self.x = x
...: self.y = y
...: def getPeri(self):
...: return (self.x+self.y)*
...: def getArea(self):
...: return self.x*self.y
...:
In []: rect = Rectangle(,) In []: rect.getPeri()
Out[]: In []: rect.getArea()
Out[]: 注意:__init__()构造方法不能直接返回

3、__new(cls[,...])  :实例化对象被调用的第一个魔法方法,它跟其他的魔法方法不一样,
它的第一个参数不是self,而是这个类cls . 一般Python是默认的不需要重写,但是有一种情况需要重写__new__()方法,什么情况呢?即:当继承一种不可变类型时,又需要修改时就需要重写__new__()方法

举例:
#大写字符串继承str类型,需要把输入的字符串变成大写的字符串,但是由于str类是不可变得类型,这时候就需要用到__new__()方法进行重写,已达到把输入的字符串变成大写字符串 >>> class CapStr(str):
def __new__(cls,string):
string = string.upper()
return str.__new__(cls,string) >>> cap = CapStr("i love ai")
>>> cap
'I LOVE AI'

4、__del__(self): 销毁实例化对象时,才会被调用并释放内存

举例:
In []: class C:
...: def __init__(slef):
...: print('我是__init__方法,我被调用了!')
...: def __del__(self):
...: print('我是__new__方法,我被调用了!')
...: In []: c=C In []: c1 = C()
我是__init__方法,我被调用了! In []: c2 = c1 In []: c3 = c2 In []: del c3 In []: del c2 In []: del c1
我是__new__方法,我被调用了! #由此代码可以看出,只有销毁实例化对象c1的时候才会调用__del__()方法

二、动手题
1、写一个FileObject类,给文件对象进行包装,从而确认在删除对象时文件能自动关闭

class FileObject:
'''给文件对象进行包装从而在删除时自动关闭文件'''
def __init__(self,filename='42.py'):
#读写模式打开一个文件
self.new_file = open(filename,'r') def __del__(self):
self.new_file.close()
del self.new_file
'''
|--先打开文件并赋值给self.new_file
|--关闭文件self.new_file.close()
|--删除文件流释放内存del self.new_file
'''

2、按照一下要求,定义一个类实现摄氏度到华氏度的转换(转换公式:华氏度= 摄氏度*1.8+32)

>>> class C2F(float):
def __new__(cls,arg=0.0):
return float.__new__(cls,arg*1.8+) >>> c2f = C2F()
>>> C2F
<class '__main__.C2F'>
>>> c2f
89.6
>>>

3、定义一个int类型,并实现一个特殊功能:当传入的参数是字符串的时候,返回该字符串找那个所有字符的ASCII码和(使用ord()获得一个字符的ASCII码值)

--知识点:

>>.isinstance():此函数判断一个对象是否是已知的类型,例如:type

isinstance()和type()的区别:

isinstance():子类的数据类型和父类的类型时同一种,考虑继承关系

type():不会考虑子类的数据类型是否和父类的数据类型是不是一样,不考虑继承关系

语法:isinstance(object,classinfo):object:实例对象,classInfo:直接或间接的类名
>> ord()函数:此函数是chr()函数(对于8位的ASCII字符串)和unichr(对于Unicode对象)函数的配比函数,他以一个字符(长度为1的字符串)作为参数,返回对应的ASCII数值,或者Unicode数值。如果给出的Unicode字符超出了你的Python定义范围,则会引发一个TypeError的异常

语法:ord(c):c:字符

>>> ord('c')

>>>
class INIT(int):
def __new__(cls,arg=):
if isinstance(arg,str):
total =
for each in arg:
total += ord(each)
arg = total return int.__new__(cls,arg)
>>> print(INIT('R'))
82
>>> print(INIT(5))
5
>>> print(INIT(5.6))
5
>>>

【python041--构造方法:构造和析造】的更多相关文章

  1. Pandas DataFrame构造简析

    参考书籍:<利用Python进行数据分析> DataFrame简介: DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值.字符串.布尔值等).Dat ...

  2. Python入门学习(二)

    1 字典 1.1 字典的创建和访问 字典不同于前述的序列类型,它是一种映射类型.它的引入是为了简化定义索引值和元素值存在特定关系的定义和访问问题. 字典的定义形式为:字典变量名 = {key1:val ...

  3. Python学习笔记(七)——魔法方法

    1.构造和析造 魔法方法就是被双下划线包围的方法 __init__()方法 __init__方法默认没有参数,返回值为none.类实例化对象需有明确的初始化步骤要重写函数 >>> c ...

  4. 跟着百度学PHP[4]OOP面对对象编程-6-构造方法(__construct)和构析方法(__destruct)

    函数就是成员方法(方法有三:构造方法.成员方法.析构方法) 下面是两种方法. 构造方法和构析方法 00x1 构造方法 构造方法会在创建对象之后自动调用.其名称为__construct <?php ...

  5. 05 面向对象:构造方法&static&继承&方法 &final

    构造方法及其重载: /* 构造方法格式特点 * a:方法名与类名相同(大小也要与类名一致) * b:没有返回值类型,连void都没有 * c:没有具体的返回值return; * 构造方法的重载 * 重 ...

  6. 16 this和super和构造代码块

    this关键词---当前类的对象的引用 public class Public { String name; int age; public static void main(String[] arg ...

  7. 智能指针(一):STL auto_ptr实现原理

    智能指针实际上是一个类(class),里面封装了一个指针.它的用处是啥呢? 指针与内存 说到指针自然涉及到内存.我们如果是在堆栈(stack)中分配了内存,用完后由系统去负责释放.如果是自定义类型,就 ...

  8. php class类的用法详细总结

    以下是对php中class类的用法进行了详细的总结介绍,需要的朋友可以过来参考下 一:结构和调用(实例化): class className{} ,调用:$obj = new className(); ...

  9. C++反汇编与逆向分析技术揭秘

    C++反汇编-继承和多重继承   学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...

随机推荐

  1. vue中使用导出表格功能

    1.下载依赖 npm install -S file-saver xlsx npm install -D script-loader 2.在src下创建vendor文件夹,并在文件夹中放两个文件 Bl ...

  2. MS16-032 漏洞复现

    exploit-db的详情:  https://www.exploit-db.com/exploits/39574/ Windows: Secondary Logon Standard Handles ...

  3. 总结docker常用命令

    docker 1docker pull 镜像 2docker ps -a 查看所有容器docker image 查看镜像 3docker rm 容器id 删除容器 docker rm 一次可以指定多个 ...

  4. [4]传奇3服务器源码分析一 SelGate

    1. 2 留存 服务端下载地址: 点击这里

  5. 18. 4Sum(双指针)

    Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums s ...

  6. E. Kefa and Watch hash 线段树

    2015-09-28 14:11:36 by opas 这题给的是一个字符串 把其中一些子串给取出来 判断是否是周期为d的字符串  还需要把 其中的一个区间完全变成一个数 ,然后在查询,我们把每个字符 ...

  7. shell 编程每日100行

    xiluhua@localhost ~/tscripts $ echo "hello world !" -bash: !": event not found xiluhu ...

  8. STO(Security Token Offering)证券型通证、代币发行介绍

    STO(Security Token Offering)证券型通证.代币发行介绍:STO(Security Token Offering)是一个新的融资概念.通过证券化的通证进行融资.早在2017年年 ...

  9. 高性能NIO框架Netty入门篇

    http://cxytiandi.com/blog/detail/17345 Netty介绍 Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具 ...

  10. vue中组件通信之父子通信:props(组件传参)

    实例一: <div id="app"> <alert msg="hhhhhhh"></alert> </div> ...