一、魔法方法

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. 地图服务报 error #2035

    参考:https://blog.csdn.net/iteye_20296/article/details/82395628 现在问题解决了,确实是config.xml里关于这个widget的配置url ...

  2. shell编程:if语句

    条件判断式的两边的空格不能生

  3. top结果解释

    top结果解释 top命令功能类似Windows的任务管理器,但不如任务管理器的直观明了,下面对各项内容进行简单介绍. 信息行 top--命令/up-更新时间/users-用户数/load avera ...

  4. activiti_change_ok

    package com.xinwei.process.controller; import java.util.Calendar; import java.util.HashMap; import j ...

  5. Uva297 Quadtrees【递归建四分树】【例题6-11】

    白书 例题6-11 用四分树来表示一个黑白图像:最大的图为根,然后按照图中的方式编号,从左到右对应4个子结点.如果某子结点对应的区域全黑或者全白,则直接用一个黑结点或者白结点表示:如果既有黑又有白,则 ...

  6. mysql 知识

    1.  数据库事务的四个特性及含义 数据库事务transanction正确执行的四个基本要素.ACID,原子性(Atomicity).一致性(Correspondence).隔离性(Isolation ...

  7. hdu2262 高斯消元

    题目:有一个地图,一个人从某个点出发,问走到花园的期望步数为多少 设某点的期望步数为Ei. 那么目标的Ei=0. Ei=(Enext1+Enext2……Enextk)/k+1. 为什么是这个公式 因为 ...

  8. jQuery效果--show([speed,[easing],[fn]])和hide([speed,[easing],[fn]])

    hide([speed,[easing],[fn]]) 概述 隐藏显示的元素 这个就是 'hide( speed, [callback] )' 的无动画版.如果选择的元素是隐藏的,这个方法将不会改变任 ...

  9. Linux基础命令---arp

    arp arp指令用来管理系统的arp缓冲区,可以显示.删除.添加静态mac地址.ARP以各种方式操纵内核的ARP缓存.主要选项是清除地址映射项并手动设置.为了调试目的,ARP程序还允许对ARP缓存进 ...

  10. 1113: No mapping for the Unicode character exists in the target multi-byte code page

    windows版本nginx启动 报错. 启动方式:到nginx所在目录执行:nginx.exe -c conf\nginx.conf 原因:所在路径中含有中文字符. 解决:换个没有中文的路径.