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. python 爬虫实例(三)

    问题描述 爬取博客园的首页数据URL[https://home.cnblogs.com/blog/page/1/],之后写到自己的Excel里面 环境: OS:Window10 python:3.7 ...

  2. mysql navcat备份使用详解

    mysql navcat备份使用详解 点击备份 然后新建备份 然后选择要备份的表 就可以了 以后这个表删除了 内容变更了 都可以点击 还原备份就可以了

  3. ATT&CK框架学习

     ATT&CK模型 ATT&CK是分析攻击者行为(即TTPs)的威胁分析框架.ATT&CK框架核心就是以矩阵形式展现的TTPs,即Tactics, Techniques and ...

  4. miniconda3 安装tensorflow

    使用miniconda3进行安装 conda create -n tensorflow conda install tensorflow 输入下面的代码进行测试 import tensorflow a ...

  5. ubuntu gcc 安装 使用

    "人多不足以依赖,要生存只有靠自己." -- 拿破仑 gcc是什么:-------------------------- Linux系统下的Gcc(GNU C Compiler)是 ...

  6. (二)spring Security 自定义登录页面与校验用户

    文章目录 配置 security 配置下 MVC 自定义登录页面 自定义一个登陆成功欢迎页面 效果图 小结: 使用 Spring Boot 的快速创建项目功能,勾选上本篇博客需要的功能:web,sec ...

  7. Python33之类和对象(继承)

    一.继承的概念及使用方法 在Python中一个类如果想使用前面一个类所有的方法和属性就需要使用继承 继承的定义     def Class_Child(Class_parent) 这样就可以在子类中使 ...

  8. php生成动态验证码 加减算法验证码 简单验证码

    预览效果: <?php /** *ImageCode 生成包含验证码的GIF图片的函数 *@param $string 字符串 *@param $width 宽度 *@param $height ...

  9. Linux下交换文件说明

    vi写文件,没有保存就关闭,会自动生成一个后缀为.swp的交换文件(隐藏文件),保存了前面写的内容 先利用R恢复,在删除这个交换文件 涉及到的命令 ls –a rm .xxx.swap -rf 

  10. Scala 类型参数

    介绍 类型参数是什么?类型参数其实就类似于Java中的泛型.先说说Java中的泛型是什么,比如我们有List a = new ArrayList(),接着a.add(1),没问题,a.add(&quo ...