一、魔法方法

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. keepalived+双主架构

    简介 keepalived是基于VRRP协议的,全称 Virtual Redundent Routing Protocal 虚拟路由协议,为解决静态路由单点故障引起的网络失效问题设计的一套主备协议 两 ...

  2. struts2.0自定义类型转换

    在Struts2.0框架中内置了类型转换器,可以很方便的实现在八大数据类型.Date类型之间的自动转换:此外也可以根据自己的需求自定义数据转换类.如下: 首先看一下项目工程中的目录 1.在新建的web ...

  3. Springboot杂七杂八

    1 加载配置文件 private static ResourceBundle resb = ResourceBundle.getBundle("serverInfo"); 然后在r ...

  4. wordpress学习(四)---url伪静态简单了解

    在page-url.php页面做测试 <h2>url伪静态</h2> 接收到的pagename参数是:<? echo $wp_query->query_vars[' ...

  5. kali linux主题下载

    主题下载网站 https://www.gnome-look.org/ 下载好安装包后解压 将文件夹移动到 usr/share/theme/ 下 mv download ../usr/share/the ...

  6. 转:php 5.5源码安装全过程

    下载 PHP 源码包 # wget http://cn2.php.net/distributions/php-5.5.15.tar.bz2 # tar xf php-5.5.15.tar.bz2 -C ...

  7. EasyUI创建DataGrid及冻结列的两种方式

       第一种方式:通过HTML标签创建数据表格控件 <table class="easyui-datagrid" title="基本数据表格" style ...

  8. codeforces 980E The Number Games

    题意: 给出一棵树,要求去掉k个点,使得剩下的还是一棵树,并且要求Σ(2^i)最大,i是剩下的节点的编号. 思路: 要使得剩下的点的2的幂的和最大,那么肯定要保住大的点,这是贪心. 考虑去掉哪些点的话 ...

  9. python 文件路径名,文件名,后缀名的操作

    需要使用路径名来获取文件名,目录名,绝对路径等等. 使用os.path 模块中的函数来操作路径名.下面是一个交互式例子来演示一些关键的特性: >>> import os >&g ...

  10. Firefox 功能笔记

    1.复制标签 说明:复制标签功能即新开一个与当前页一样的标签页,这个功能在Chrome中点击标签右键复制即可,但是在firefox中没有 Firefox中实现:Ctrl+拖动标签页