【python041--构造方法:构造和析造】
一、魔法方法
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--构造方法:构造和析造】的更多相关文章
- Pandas DataFrame构造简析
参考书籍:<利用Python进行数据分析> DataFrame简介: DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值.字符串.布尔值等).Dat ...
- Python入门学习(二)
1 字典 1.1 字典的创建和访问 字典不同于前述的序列类型,它是一种映射类型.它的引入是为了简化定义索引值和元素值存在特定关系的定义和访问问题. 字典的定义形式为:字典变量名 = {key1:val ...
- Python学习笔记(七)——魔法方法
1.构造和析造 魔法方法就是被双下划线包围的方法 __init__()方法 __init__方法默认没有参数,返回值为none.类实例化对象需有明确的初始化步骤要重写函数 >>> c ...
- 跟着百度学PHP[4]OOP面对对象编程-6-构造方法(__construct)和构析方法(__destruct)
函数就是成员方法(方法有三:构造方法.成员方法.析构方法) 下面是两种方法. 构造方法和构析方法 00x1 构造方法 构造方法会在创建对象之后自动调用.其名称为__construct <?php ...
- 05 面向对象:构造方法&static&继承&方法 &final
构造方法及其重载: /* 构造方法格式特点 * a:方法名与类名相同(大小也要与类名一致) * b:没有返回值类型,连void都没有 * c:没有具体的返回值return; * 构造方法的重载 * 重 ...
- 16 this和super和构造代码块
this关键词---当前类的对象的引用 public class Public { String name; int age; public static void main(String[] arg ...
- 智能指针(一):STL auto_ptr实现原理
智能指针实际上是一个类(class),里面封装了一个指针.它的用处是啥呢? 指针与内存 说到指针自然涉及到内存.我们如果是在堆栈(stack)中分配了内存,用完后由系统去负责释放.如果是自定义类型,就 ...
- php class类的用法详细总结
以下是对php中class类的用法进行了详细的总结介绍,需要的朋友可以过来参考下 一:结构和调用(实例化): class className{} ,调用:$obj = new className(); ...
- C++反汇编与逆向分析技术揭秘
C++反汇编-继承和多重继承 学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...
随机推荐
- 并查集(disjoint)
合并,查找的集合 第一,建立两个函数,一个用来查找(find),一个用来合并(merge): 如下的一个模板: 题目: 亲戚(Relations) 或许你并不知道,你的某个朋友是你的亲戚.他可能是你的 ...
- sqlserver中查询表字段的sql语句
sqlserver中的表信息字段信息这些东西也是放到系统表中的,以下sql语句用于查询某表的字段信息. select t1.id object_id,t1.name object_name,t2.va ...
- python windows 下pip easy_install 使用错误的问题
最近电脑重装了系统,又重新安装python .在官网下载了安装包后电脑成功安装了,但使用pip命令时出现以下错误 Fatal error in launcher: Unable to create p ...
- SNMP 安装及使用
一.SNMP的安装 1.安装 snmp服务,python扩展等 参考:http://lihuipeng.blog.51cto.com/3064864/915965 [root@localhost] y ...
- vue-cli 脚手架搭建
1,下载node.js node.js 集成npm 管理器 2,打开命令行工具(win+R) node -v npm -v 出现对应版本号,则安装完成 3,配置代理信息 详见代理设定:https:// ...
- python urlopen
Python urllib 库提供了一个从指定的 URL 地址获取网页数据,然后对其进行分析处理,获取想要的数据. urlopen返回 一个类文件对象(fd),它提供了如下方法:read() , re ...
- linux常用命令:nl 命令
nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...
- flask 请求上下文
一篇引用大牛的 https://www.cnblogs.com/zhaopanpan/p/9457343.html ### 线程安全 ```python# 线程不安全class Foo(object) ...
- ASP.NET定时调用WebService 运行后台代码
效果: 通过在网站的Global.asax的Application_Start方法中 加入定时器 定时调用WebService 该WebService的一个方法 负责在后台 向数据库的某个表加入数据 ...
- mac shell终端编辑命令行快捷键——行首,行尾
Ctrl + d 删除一个字符,相当于通常的Delete键(命令行若无所有字符,则相当于exit:处理多行标准输入时也表示eof) Ctrl + h 退格删除一个字符,相当 ...