一、魔法方法

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. react native初识

    开发的第一步就是搭建rn的开发环境,你可以去官网去查看教程也可以 点击 http://bbs.reactnative.cn/topic/10 进去查看window的开发环境安装的教程:注意:很关键的一 ...

  2. Linux 7.x 设置主机名称

    Linux 7.x 设置主机名称 在Linux7.x 版本中,临时设置主机名称使用指令:hostnamectrl set-name 主机名称 [root@localhost ~]# hostname ...

  3. laravel更改默认的登录密码加密方式

    laravel更改默认的登录密码加密方式   laravel 默认用的登录密码加密方式是: $password = Hash::make('password'); 而我平时用的密码加密方式是: $pa ...

  4. 混合型log,info按大小分,error按日期

    1.配置文件 <?xml version="1.0" encoding="utf-8"?> <configuration> <!- ...

  5. Yii2 nginx配置伪静态

    Yii2 配置 Nginx 伪静态 主要检查以下代码: location / { # Redirect everything that isn't a real file to index.php t ...

  6. Windows10上安装Keras 和 TensorFlow-GPU

    安装环境: Windows 10 64bit GPU: GeForce gt 720 Python: 3.5.3 CUDA: 8 首先下载Anaconda3的Win10 64bit版,安装Python ...

  7. hive中的with用法

    hive 可以通过with查询来提高查询性能,因为先通过with语法将数据查询到内存,然后后面其它查询可以直接使用,这种方法与创建临时表类似但是不需要创建临时表实体表,内存中的子查询结果在会话结束后会 ...

  8. Linux基础命令---文本编辑tee

    tee 将标准输入的内容复制到指定的文件中,同时在标准输出中显示. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora.   1.语法   ...

  9. 蓝牙Profile的概念和常见种类(转)

    蓝牙Profile Bluetooth的一个很重要特性,就是所有的Bluetooth产品都无须实现全部 的Bluetooth规范.为了更容易的保持Bluetooth设备之间的兼容,Bluetooth规 ...

  10. hive 用户行为分析(活跃。启动,留存,回访,新增)的一些经典sql

    很简单的sql 用户分析语句 :只要自定义简单的udf函数 获取统计时间createdatms字段的使用的日历类 add方法 和simpledateformat 将long类型的 定义多个重载方法 获 ...