python_魔法方法(一):构造和析构

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

魔法方法是面向对象的python的一切,它的魔力体现在总能在合适的时候调用。

先来介绍析构和构造的三个魔法方法:

__init__():构造方法,类在实例化成对象的时候会首先调用这个方法(可选)__new__():才是在一个对象实例化的时候所调用的一个方法,与其他魔方方法不同,它的第一个参数是cls(类),其他参数会传给__init__()__del__():如果说__init__()和__new__()是对象的构造器话,__del__()方法将是打工对象被销毁时调用

1、__init__(self[,...])实例:
 1 class Rectangle:
 2     ‘‘‘
 3     定义个一个矩形列,需要长宽两个参数
 4     需要对象在初始化的时候拥有长宽两个参数,因此需要重写__init__()方法
 5     ‘‘‘
 6     def __init__(self,x,y):  #__init__()返回值一定是None,所以不需要return语句
 7         self.x = x
 8         self.y = y
 9     def getPerl(self):
10         return (self.x + self.y) * 2
11     def  getArea(self):
12         return  self.x * self.y
13
14 rect = Rectangle(3,4)
15 print(rect.getArea(),rect.getPerl())

打印结果:

14

12

这里需要注意的是,__init__()方法的返回值一定是None,不能是其他:

1  class A():
2     def __init__(self):
3         return "A"
4
5 cup = A()
执行结果:Traceback (most recent call last):
  File "<pyshell#26>", line 1, in <module>
    cup = A()
TypeError: __init__() should return None, not ‘str‘

所以一般在需要进行初始化的时候才重写__init__()方法,其实__init__()并不是实例化对象时第一个被调用的魔法方法

2、__new__(cls[,...])

__new__()才是在实例化对象时所调用的第一个方法。它跟其他魔法方法不同,它的第一个参数不适合self而是类(cls),而其他的参数会直接传递给__init__()方法

__new__()方法需要返回一个实例化对象,通常是cls这个实例化的对象,当然也可以返回其他对象。

__new__()方法平时很少去重写它,一般让python用默认的方案执行就可以了。但是有一种情况需要重写这个魔法方法,就是当继承一个不可变类型的时候,它的特定就尤为重要了。

1 class CapStr(str):
2     def __new__(cls,string):
3         string = string.upper()
4         return str.__new__(str,string)  #这里一定是返回继承类的__new__()方法,否则容易造成死循环
5
6 capstr = CapStr(‘good afternoon‘)
7 print(capstr)
8
9 #结果为:GOOD AFTERNOON

这里返回的str.__new__(str,string)做法是很值得推荐的,只需要重写关组的内容,其他的琐碎东西交给python的默认机制去完成就可以了,毕竟python本身比我们自己写的要好很多

3、__del__(self)

如果说__init__()和__new__()方法是对象的构造器的话,那么python也析构了一个构造器,__del__()方法,当对象被销毁时,这个方法就一定会被调用,但要注意的是,并非del x就等同于自动调用了x.__del__(),__del__()方法是当垃圾回收机制回收这个对象的时候调用的

>>> class C():
    def __init__(self):
        print(‘我是__init__()方法‘)
    def __del__(self):         print(‘我是__del__()方法‘)

>>> c1 = C()
我是__init__()方法
>>> c2 = c1
>>> c3 = c2
>>> del c1
>>> del c2
>>> del c3
我是__del__()方法

原文地址:https://www.cnblogs.com/pinpin/p/9902420.html

时间: 2024-08-29 23:51:00

python_魔法方法(一):构造和析构的相关文章

python魔法方法之构造和析构

python的类实例化的时候会默认执行该类的构造方法_init_ 1 class Rectangle: 2 def __init__(self,x,y): 3 self.x=x 4 self.y=y 5 def getArea(self): 6 return self.x * self.y 7 r = Rectangle(5,10) 8 print(r.getArea()) python中一个类被创建时最先执行的方法是new方法,当需要修改某些不可变类型的对象时需要重写他的new方法 1 #重写

python_魔法方法(二):算术运算

python2.2之后,对类和类型做了同意,将int().float().str().list().touple()这些BIF转换为工厂函数 >>> type(len) <class 'builtin_function_or_method'> >>> type(int) <class 'type'> >>> type(dir) <class 'builtin_function_or_method'> >>

python_魔法方法(三):__str__()和__repr__()

使用python的魔法方法和time模块定制一个计时器的类 1.用time模块里的localtime()方法获取时间2.time.localtime返回struct_time格式3.表现你的类:__str__()和__repr__()先来看下__str__()和__repr__()魔法方法 >>> class A(): def __str__(self): return "我在学习python" >>> a = A() >>> pr

魔方方法篇第一章--------构造与析构

我们最为熟知的基本的魔法方法就是 __init__ ,我们可以用它来指明一个对象初始化的行为.然而,当我们调用 x = SomeClass() 的时候, __init__ 并不是第一个被调用的方法.事实上,第一个被调用的是 __new__ ,这个 方法才真正地创建了实例.当这个对象的生命周期结束的时候(指类被删除之后), __del__ 会被调用.让我们近一步理解这三个方法: __new__(cls,[...) __new__ 是对象实例化时第一个调用的方法,它只取下 cls 参数,并把其他参数

python_面向对象魔法方法指南

原文: http://www.rafekettler.com/magicmethods.html 原作者: Rafe Kettler 翻译: hit9 原版(英文版) Repo: https://github.com/RafeKettler/magicmethods Contents (译)Python魔法方法指南 简介 构造方法 操作符 比较操作符 数值操作符 一元操作符 常见算数操作符 反射算数运算符 增强赋值运算符 类型转换操作符 类的表示 访问控制 自定义序列 预备知识 容器背后的魔法方

python 魔法方法(学习过程的笔记)

有小伙伴会问,什么是python的魔法方法,python的魔法方法有什么用呢, 它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两个下划线包围来命名的. 我感觉魔法方法很牛逼的, 目前我们常见的魔法方法大致可分为以下几类: 构造与初始化 类的表示 访问控制 比较操作 容器类操作 可调用对象 Pickling序列化 在我们写python中最常见的就是__init__,这是python的构造方法,这是初始化对象,定义一个对象的初始化的值,_

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

python魔法方法详解

文章来源:http://blog.csdn.net/koko66/article/details/42709279 据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的. Python 的魔术方法非常强大,然而随之而来的则是责任.了解正确的方法去使