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. 使用第三方Java类库jaudiotagger完成Flac音频文件metadata(元数据)的读和修改

    最近需要使用Java Swing做个读写Flac格式音频文件的小GUI工具,虽然Mp3tag完全可以完成Flac的读写(编辑)任务,但是为了简化工作流程(编辑Flac信息后调用其它系统的接口完成部分信 ...

  2. P1993 小K的农场(差分约束)

    小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了 ...

  3. CentOS7服务器查看相关配置命令

    CPU个数:(base) [jiangshan@localhost ~]$ grep 'physical id' /proc/cpuinfo | sort -u | wc -l2CPU核数:(base ...

  4. 028 Android 旋转动画+病毒查杀效果+自定义样式的ProgressBar

    1.目标效果 旋转动画+病毒查杀效果 2.xml布局文件 (1)activity_kill_virus.xml <?xml version="1.0" encoding=&q ...

  5. Python——多态、检查类型

    一.多态 Python变量并不需要声明类型,同一个变量可以在不同的时间引用不同的对象,当一个变量在调用同一个方法,可以呈现出多种行为,而具体呈现出哪种行为由该变量引用的对象来决定,这就是多态. 先看一 ...

  6. TZOJ5703: C++实验:学生成绩类的实现

    #include<iostream> #include<string> #include<stdio.h> using namespace std; class s ...

  7. bash 和 powershell 常用命令集锦

    Linux Shell # 1. 后台运行命令 nohup python xxx.py & # 查找替换 ## 只在目录中所有的 .py 和 .dart 文件中递归搜索字符"main ...

  8. netty--处理器

    编解码器的基类: 编码:MessageToByteEncode 解码:ByteToMessageDecoder

  9. RMAN备份脚本执行遇到RMAN-03002,06091问题处理

    一 问题描述 客户说RMAN备份脚本执行有的时候报错,有的时候正常!!! 远程登陆客户环境,查询最后一次备份的日志报错信息,得到 RMAN-03002: failure of delete comma ...

  10. 采用二进制方式安装K8S集群,版本etcd-v3.3.10,flannel-v0.11.0,kubernetes-server-linux-amd64

    官方提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环 ...