python_面向对象——双下划线方法
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_面向对象——双下划线方法的更多相关文章
- python面向对象双下划线方法与元类
目录 双下划线方法(__) 元类简介 产生类的两种表现形式 元类的基本使用 元类进阶操作 __new__方法 双下划线方法(__) 面向对象中的双下方法也有一些人称之为是魔法方法,有些双下方法不需要刻 ...
- Python - 面向对象编程 - 魔术方法(双下划线方法)
什么是魔术方法 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method 魔术方法,也叫双下划线方法 有哪些重要的魔术方法? __new__ https://www.c ...
- python类中的双下划线方法
__getitem__,__setitem__和__delitem__ 实现了对象属性的字典化操作. class Person: def __init__(self, name, age, hobby ...
- python类中方法加单下划线、双下划线、前后双下滑线的区别
首先看一段代码: class Foo(): def __init__(self): print "__init__ method" def public_method(self): ...
- Python面向对象 | 双下方法
定义:双下方法是特殊方法,他是解释器提供的.由双下划线+方法名+双下划线 .它具有特殊意义的方法,双下方法主要是python源码程序员使用的,我们在开发中尽量不要使用双下方法,但是深入研究双下方法,更 ...
- ORM( ORM查询13种方法3. 单表的双下划线的使用 4. 外键的方法 5. 多对多的方法 ,聚合,分组,F查询,Q查询,事务 )
必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或 ...
- Python笔记_第三篇_面向对象_4.单下划线和双下划线
说道这里我们需要稍微暂停一下.前面我们说到了类是作为一个对象存放容器.这个容器里面有属性和方法.最好的理解类的方式就是把类想想成一个容器. 然后构造了一个析构函数和构造函数,然后又对object和se ...
- python 面向对象三 访问权限 下划线 双下划线
一.双下划线 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问. ...
- Python3 单下划线_双下划线__开头
Python 中,下划线对解释器有特殊的含义,而且是内建标识符所使用的符号,使用时要多加留意. 在 Python3 的面向对象中,双下划线开头的变量和方法表名为私有变量和私有方法. __private ...
随机推荐
- 方法重载overload与方法重写overwrite
方法重载overload: 在同一个类中,出现相同的方法名,与返回值无关,参数列表不同:1参数的个数不同 2参数类型不同 在调用方法时,java虚拟机会通过参数列表来区分不同同名的方法 方法重写ove ...
- jvm误区--动态对象年龄判定
原文链接:https://blog.csdn.net/u014493323/article/details/82921740 虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThres ...
- 015 Android md5密码加密及其工具类
1.md5加密介绍 MD5算法是广泛使用的杂凑函数,也就是哈希函数,英文全拼是:Message Digest Algorithm,对应的中文名字是消息摘要算法. MD5加密:将字符串转换成 32位的字 ...
- 原生js 实现better-scroll效果,饿了么菜单内容联动,即粘即用
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- js判断是Android还是iOS
var u = navigator.userAgent, app = navigator.appVersion; var isAndroid = u.indexOf('Android') > - ...
- todo...git ssh http的区别
todo...git ssh http的区别 https://www.jianshu.com/p/2cced982009f https://www.cnblogs.com/skating/p/6296 ...
- JSP的部分知识(一)
通过Servlet进行整个网站的开发是可以的. 不过在Servlet中输出html代码,特别是稍微复杂一点的html代码,就会给人一种很酸爽的感觉. 如果能够直接使用Html代码,然后在html中写j ...
- 剑指offer48:不用加减乘除做加法
1 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 2 思路和方法 位运算符:两个数异或(^)[1^0=1, 1^1=0, 0^0=0, 0^1=1, 5^5 ...
- python 之 re模块、hashlib模块
6.16 re模块 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Python中,并通过 ...
- PAT(B) 1052 卖个萌(Java:0分 待解决,C:20分)
题目链接:1052 卖个萌 (20 point(s)) 题目描述 萌萌哒表情符号通常由"手"."眼"."口"三个主要部分组成.简单起见,我们 ...