1.__str__和__repe__

class Person(object):

    def __init__(self,name,age):
self.name = name
self.age = age def __str__(self):
return 'stf:我叫{},今年{}岁'.format(self.name,self.age) def __repr__(self):
return 'repr:我叫{},今年{}岁'.format(self.name, self.age) p = Person('wdc',22) print(repr(p))
print(str(p))
print(p)

  str函数或者print函数调用时 = obj.__srt__()

  repr函数或者交互式解释器中调用时 = obj.__repr__()

  这两个方法的返回值必须是字符串,否则会抛出异常

class Person(object):

    def __init__(self,name,age):
self.name = name
self.age = age # def __str__(self):
# return 'stf:我叫{},今年{}岁'.format(self.name,self.age) def __repr__(self):
return 'repr:我叫{},今年{}岁'.format(self.name, self.age) p = Person('wdc',22) print(repr(p))
print(str(p))
print(p)

  如果__str__没有被定义,那么就会使用__repr__来代替输出。

2.__del__析构方法

class Person(object):

    def __init__(self,name,age):
self.name = name
self.age = age def __del__(self):
print('析构方法') p = Person('wdc',22) print('')
print('')
del p #删除对象p
print('')
print('')

当对象再内存中被释放时,自动触发执行。

3.__new__方法

class Person(object):

    def __init__(self,name,age):
self.name = name
self.age = age
print(self.name) def __new__(cls, *args, **kwargs):
# 负责执行__init__,进行一些初始化前的工作
print(cls,args,kwargs)
return object.__new__(cls) p = Person('wdc',22)

  当有__new__方法时,不执行__init__方法,直接执行__new__方法,如果要想知道__init__方法,就要在__new__中返回:object.__new__(cls)

__new__方法实现单例模式:

class Person(object):
tasks = []
instance = None
def __init__(self,name):
self.name = name def add_task(self,job):
self.tasks.append(job)
print('{}添加任务{},共{}个任务'.format(self.name,job,len(self.tasks))) def __new__(cls, *args, **kwargs):
# 只有第一次实例化的时候,正常精选,后面每次实例化,并不正在创建一个新实例
if cls.instance == None:
# 进行正常的实例化,并把实例化后的对象,村再cls.instance中
obj = object.__new__(cls) #实例化过程
cls.instance = obj #把实例化好的对象存下来
return cls.instance #以后的每次实例化,直接返回第一次村的实例对象 p1 = Person('wdc')
p2 = Person('yhf')
p3 = Person('qqq') p1.add_task('w')
p2.add_task('d')
p3.add_task('c')

4.__call__方法

      :在对象后加括号执行

class Per(object):

    def __init__(self,name):
self.name = name def __call__(self, *args, **kwargs):
print(self,args,kwargs) p = Per('wdc')
p.__call__()
p()

python_面向对象——双下划线方法的更多相关文章

  1. python面向对象双下划线方法与元类

    目录 双下划线方法(__) 元类简介 产生类的两种表现形式 元类的基本使用 元类进阶操作 __new__方法 双下划线方法(__) 面向对象中的双下方法也有一些人称之为是魔法方法,有些双下方法不需要刻 ...

  2. Python - 面向对象编程 - 魔术方法(双下划线方法)

    什么是魔术方法 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method 魔术方法,也叫双下划线方法 有哪些重要的魔术方法? __new__ https://www.c ...

  3. python类中的双下划线方法

    __getitem__,__setitem__和__delitem__ 实现了对象属性的字典化操作. class Person: def __init__(self, name, age, hobby ...

  4. python类中方法加单下划线、双下划线、前后双下滑线的区别

    首先看一段代码: class Foo(): def __init__(self): print "__init__ method" def public_method(self): ...

  5. Python面向对象 | 双下方法

    定义:双下方法是特殊方法,他是解释器提供的.由双下划线+方法名+双下划线 .它具有特殊意义的方法,双下方法主要是python源码程序员使用的,我们在开发中尽量不要使用双下方法,但是深入研究双下方法,更 ...

  6. ORM( ORM查询13种方法3. 单表的双下划线的使用 4. 外键的方法 5. 多对多的方法 ,聚合,分组,F查询,Q查询,事务 )

    必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或 ...

  7. Python笔记_第三篇_面向对象_4.单下划线和双下划线

    说道这里我们需要稍微暂停一下.前面我们说到了类是作为一个对象存放容器.这个容器里面有属性和方法.最好的理解类的方式就是把类想想成一个容器. 然后构造了一个析构函数和构造函数,然后又对object和se ...

  8. python 面向对象三 访问权限 下划线 双下划线

    一.双下划线 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问. ...

  9. Python3 单下划线_双下划线__开头

    Python 中,下划线对解释器有特殊的含义,而且是内建标识符所使用的符号,使用时要多加留意. 在 Python3 的面向对象中,双下划线开头的变量和方法表名为私有变量和私有方法. __private ...

随机推荐

  1. C++用于类型转换的4个操作符

    Dynamic_cast,   const_cast,  static_cast,  reinterpret_cast. (1)reinterpret_cast 用于基本的类型转换.如 in *ip; ...

  2. cnbolgs博客中添加Latex支持

    参考:http://www.cnblogs.com/ilogic/archive/2012/08/05/latex.html 主要是利用在线生成公式的工具:MathJax,但要在博客上获得 MathJ ...

  3. torch.Tensor和numpy.ndarray

    1. torch.Tensor和numpy.ndarray相互转换 import torch import numpy as np # <class 'numpy.ndarray'> np ...

  4. 汉字转拼音js工具:

    / JavaScript Document var PinYin = { "a": "\u554a\u963f\u9515", "ai": ...

  5. linux--Linux 各目录及每个目录的详细介绍

    2017年08月31日 17:53:38 worthsen 阅读数 3490更多 所属专栏: Linux   版权声明:本文为博主原创文章,如要转载,请注明地址,谢谢^...^ https://blo ...

  6. firefox 获取xpath

    在做一个爬虫是,输入内容后,会自动显示内容,而且只能选择,不能根据输入的提交,一点就失去焦点,找不到相关内容 后来发现firefox的查看元素的最左边的类似于鼠标尖头的按钮,就是确保这种情况下,去查找 ...

  7. Scala 算法案例

    移除第一个负数之后的所有负数 // 构建数组 val a = ArrayBuffer[Int]() a += (1, 2, 3, 4, 5, -1, -3, -5, -9) // 每发现一个第一个负数 ...

  8. 怎样输出Hello World

    方法一: 进入python交互模式, 然后使用: print()函数输出 方法二:  新建一个.py文件, 然后写入print()函数, 再使用python命令执行输出:

  9. 第4章 JIT编译器

    4.1 JIT概览 语言根据执行的方式不同分为编译型语言和解释型语言.以C++为代表的编译型语言在执行前需要编译成机器码,不同的CPU需要不同的编译器,编译成功后在同一台机器不需再次编译.以Pytho ...

  10. WebSocket 的应用

    后面用到了再来做整理 链接地址:https://www.cnblogs.com/zhaof/p/9833614.html