一. 内置方法和析构函数

 __str__() 在调用print 打印对象时自动调用 是给用户用的 是一个描述对象的方法__repr__()    是给机器用的在python 解释器里面直接敲对象在回车后调用次方法对于一个object来说,__str__和__repr__都是返回对object的描述,只是,前一个的描述简短而友好,后一个的描述,更细节复杂一些,
对于有些数据类型,__repr__返回的是一个string,

优点: 当一个对象属性值很多 并且需要都需要打印 重写了
__str__方法后简化了代码

1. __repr__()  方法

class Apple:# 实现构造器def __init__(self, color, weight):self.color = color;self.weight = weight;# 重写__repr__方法,用于实现Apple对象的“自我描述”def __repr__(self):return "Apple[color=" + self.color +\", weight=" + str(self.weight) + "]"
a = Apple("红色" , 5.68)
# 打印Apple对象
print(a)  # Apple[color=红色, weight=5.68]
print(a.__dict__)  # {'color': '红色', 'weight': 5.68}

2. __str__()方法

# 创建一个简单的类
class person(object):def __init__(self,name,age,height,weight):# 定义属性       self.name=nameself.age=ageself.height=heightself.weight=weightdef __str__(self):return "%s-%d-%d-%d" % (self.name,self.age,self.height,self.weigh)per2=person("张三丰",200,165,65)
# print(per2.name,per2.age,per2.height,per2.weight)  #张三丰 200 165 65kgprint(per2)  #张三丰 200 165 65kg

 3. __len__  ()方法

# __len__  和 len配合使用
class Students(object):def __init__(self, *args):self.names = argsdef __len__(self):return len(self.names)aa=Students("111",222)print(aa)    # <__main__.Students object at 0x000002E1EBB5D5F8>
print(len(aa)) # color': '红色', 'weight': 5.68}

4.__del__()

# 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作
# (例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。# 析构函数 :__del__()释放对象自动调用

class person(object):def run(self):print("run")def __init__(self, name, age, height, weight):self.name = nameself.age = ageself.height = heightself.weight = weightdef __del__(self):print("这里是析构函数11111111")
per = person("张三", 25, 300, 100)
# 释放对象       就相当于删除了    就不能访问了   这是手动释放
del per# 在函数里定义的对象会在函数结束时自动释放(删除)  可以减少内存浪费空间
def fun():per2 = person("李四", 1000, 2000, 30000)print(per2.name)
fun()# 这里是析构函数11111111
# 李四
# 这里是析构函数11111111

class Person(object):def __init__(self,name):self.name = namedef __del__(self):print("实例对象:%s"%self.name,id(self))print("python解释器开始回收%s对象了" % self.name)print("类对象",id(Person))  # 类对象 2052877825944

zhangsan= Person("张三")
print("实例对象张三:",id(zhangsan))  # 实例对象张三: 2052909816408
print("------------")
lisi= Person("李四")
print("实例对象李四:",id(lisi))  # 实例对象李四: 2052909815232# 类对象 2052877825944
# 实例对象张三: 2052909816408
# ------------
# 实例对象李四: 2052909815232
# 实例对象:张三 2052909816408
# python解释器开始回收张三对象了
# 实例对象:李四 2052909815232
# python解释器开始回收李四对象了

import time
class Animal(object):# 初始化方法
# 创建完对象后会自动被调用def __init__(self, name):print('__init__方法被调用')self.__name = name
# 析构方法
# 当对象被删除时,会自动被调用def __del__(self):print("__del__方法被调用")print("%s对象马上被干掉了..."%self.__name)
# 创建对象
dog = Animal("哈皮狗")
# 删除对象
del dog
cat = Animal("波斯猫")
print(id(cat))
cat2 = cat
print(id(cat2))
cat3 = cat
print(id(cat3))
print("---马上 删除cat对象")
del cat
print("---马上 删除cat2对象")
del cat2
print("---马上 删除cat3对象")
del cat3print("程序2秒钟后结束")
time.sleep(2)# _init__方法被调用
# __del__方法被调用
# 哈皮狗对象马上被干掉了...
# __init__方法被调用
# 2710758308552
# 2710758308552
# 2710758308552
# ---马上 删除cat对象
# ---马上 删除cat2对象
# ---马上 删除cat3对象
# __del__方法被调用
# 波斯猫对象马上被干掉了...
# 程序2秒钟后结束

5. __call__()

# __call__
# 上面我们看到,后面加上括号可以直接调用,我们称之后可调用对象。
# 类也是一个可调用对象,其调用返回实例,故类对象的类即元类(最著名的是type)也要实现__call__方法。
# object类没有__call__方法,所以大部分直接继承object类的类所产生的对象不能被调用。(type类虽然也继承了object类,但是其实现了该方法)

class Person(object):def __init__(self, name, gender):self.name = nameself.gender = genderdef __call__(self, friend):print ('My name is %s...' % self.name)print ('My friend is %s...' % friend)def aa(self,cc):print("111111111111111111111111111111111",cc,self.name)p = Person('Bob', 'male')
print(p)
p("张三")
# 单看 p('Tim') 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。
p.aa("卧槽")
# <__main__.Person object at 0x0000020E64D43A90>
# My name is Bob...
# My friend is 张三...
# 111111111111111111111111111111111 卧槽 Bob

# 区别   没有是call 只能    对象.方法   a.bb()
class B:def __init__(self,name):self.name=namedef bb(self,lover):print("111111111111111111111",lover)
a=B("张三")a.bb("卧槽!!1")# 区别   没有是call 可以    使用对象直接调用方法 a()
class B:def __init__(self,name):self.name=namedef __call__(self,lover):print("111111111111111111111",lover)
a=B("张三")a("卧槽!!1")

6.__new__

# __new__方法只负责创建
# __init__方法只负责初始化
# _new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,
# 可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例

_new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供

__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例

__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

class Dog(object):def __init__(self,name,age):self.name=nameself.age=ageprint("----init方法-----")def __new__(cls,nice,boy):#cls此时是Dog指向的那个类对象print("----new方法-----")return object.__new__(cls)
dd=Dog("张三","啦啦啦啦啦")

class ClassA(object):def __new__(cls, *args, **kwargs):object = super(ClassA, cls).__new__(cls)print("in New")return objectdef __init__(self, *args, **kwargs):print("in init")bb=ClassA()
# in New
# in init
# 可以看出先调用__new__()
# 再调用 __init__()print("**************************************")class ClassA(object):def __new__(cls, *args, **kwargs):object = super(ClassA, cls).__new__(cls)print("in New")# return objectdef __init__(self, *args, **kwargs):print("in init")
cc=ClassA()# in New# __new__():真正的构造函数,负责返回实例;
# __init__():初始化函数,负责在得到实例后进一步初始化一些实例变量。
# 如果__new__()是类函数,一定会执行;__init__()是实例函数,如果__new__()未返回实例,那么__init__()将没有机会执行。

# __new__
class A:__aa=Falsedef __init__(self,name,age):self.name=nameself.age=agedef __new__(cls, *args, **kwargs):if cls.__aa:return  cls.__aacls.__aa=object.__new__(A)return cls.__aa
f=A("张三",66666)
f.cloth="小棉袄"
g=A("哈哈哈",25)
print(f)
print(g)
print(f.name)
print(g.name)
print(g.cloth)
# __new__ 的作用
# 1、__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。
# 假如我们需要一个永远都是正数的整数类型,通过集成int,我们可能会写出这样的代码。
# 3、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))
# __new__出来的实例,或者直接是object的__new__出来的实例
# 4、__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

7.  __hash__

# __hash__
# 返回对象的哈希值,用整数表示。哈希值在字典查找时,可用于快速比较键的值。
class F(object):def __init__(self,name,sex):self.name=nameself.sex=sexdef __hash__(self):return  hash(self.name+ self.sex)a=F("张三","男")
b=F("张三","1111")
print(hash(a))
print(hash(b))# 337530981586063875
# 6407353799004837497

8. __eq__

# 如果不实现__eq__方法,那么自定义类型会调用默认的__eq__方法, 通过默认方法进行比较的相等条件相当严格,只有自己和自己比才会返回True,表现如下
# __eq__class Item:def __init__(self, name):self. name=  namedef __eq__(self, other):if self. name== other. name:return Trueelse:return  False
first = Item('hello')
second = Item('hello')
print(first == second) # True

class A(object):def __init__(self, name):self.name = namedef __eq__(self, obj):return self.name == obj.namea = A("Leon")
b = A("Leon")print(a==b) True

class student(object):def __init__(self, name, age, sex):self.name = nameself.age = ageself.sex = sexdef __eq__(self, *args, **kwargs):return object.__eq__(self, *args, **kwargs)# python中的对象是否相等有两个层面,一个层面是是否是同一个对象,及在内存中是否共用一个内存区域,用is判断,另一个是对象的值是否相等,用==判断。
like = student("like", 25, "male")
xue = student("xue", 23, "female")
dong = student("like", 25, "male")print(like is xue)  # False
print(like is dong)  # False
print(like == dong)  # Falseclass student(object):def __init__(self,name,age,sex):self.name = nameself.age = ageself.sex = sexdef __eq__(self,other):return self.name == other.namelike = student("like",25,"male")
dong = student("like",23,"female")
print(like == dong) #True

转载于:https://www.cnblogs.com/Sup-to/p/10873114.html

二. python面向对象(内置方法and析构函数)相关推荐

  1. python字典内置方法_柳小白Python学习笔记 12 内置方法之字典方法

    学习字典的时候只学习了最基本的字典定义和创建方式.今天再学习两种字典的创建方法及字典内置方法的使用. 现在春暖花开,所以我用花的元素创建了garden(花园)系列字典,字典的键是flowers(花名) ...

  2. Python的内置方法(二)

    2019独角兽企业重金招聘Python工程师标准>>> open(name[,mode[,buffering]]):打开文件,返回一个file类型的对象.如果文件不能打开,抛出IOE ...

  3. python字符串内置方法

    网上已经有很多,自己操作一遍,加深印象. dir dir会返回一个内置方法与属性列表,用字符串'a,b,cdefg'测试一下 dir('a,b,cdefg') 得到一个列表 ['__add__','_ ...

  4. 7.python字符串-内置方法分析

    上篇对python中的字符串内置方法进行了列举和简单说明,但这些方法太多,逐一背下效率实在太低,下面我来对这些方法按照其功能进行总结: 1.字母大小写相关(中文无效) 1.1 S.upper() -& ...

  5. python getattr_Python 内置方法和属性应用:反射和单例

    1. 前言 python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict.list.set.min.max.range.sorted等.笔者最近在做项目框架时 ...

  6. 面向对象--内置方法

    __名字__ 类中的特殊方法\内置方法 双下方法 魔术方法 magic_method 类中的每一个双下方法都有它自己的特殊意义 1.__call__ 相当于 对象() class A:def __ca ...

  7. python 的内置方法zip()介绍

    转载至:https://blog.csdn.net/eric_sunah/article/details/20551087 定义:zip([iterable, ...]) zip()是Python的一 ...

  8. Python各种内置方法

    1.attr 系列 class foo:def __init__(self,NAME):self.name=NAMEdef __setattr__(self, key, value):# 作用:可以对 ...

  9. python使用内置方法和修饰器方法获取类名、函数名

    1. 外部获取 从外部的情况好获取,可以使用指向函数的对象,然后用__name__属性. def a():pass a.__name__ 或者 getattr(a,'__name__') 2. 内部获 ...

最新文章

  1. 剑指offer:第一个只出现一次的字符
  2. golang 获取切片 slice 第一个 最后一个 元素
  3. 【带着canvas去流浪(10)】文字烟花
  4. LINUX网络状态工具SS命令使用详解
  5. 【POI xls】解析xls遇到的问题
  6. 自动加载 autoload
  7. php随机数、时间、字符串函数,正则,数组函数
  8. JavaScript event loop事件循环 macrotask与microtask
  9. .NET平台下Web树形结构程序设计
  10. python3 numpy中矩阵np.dot(a,b)乘法运算
  11. 大一c语言上机题库及详解答案,二级C语言上机题答案(题库答案).doc
  12. CMMI五级认证是什么?
  13. (带手机版数据同步)高等院校学院学校类网站源码 政府单位学院学校网站织梦模板
  14. 有关java.lang.ClassNotFoundException报错的总结
  15. ssl证书在哪?如何查看ssl证书内容
  16. 33. Prometheus-报警-通知模板参考
  17. 计算机一级网址打不开怎么办,路由器设置网址打不开怎么办?
  18. 自定义 UINavigationController
  19. android 获取iccid imsi
  20. 电子管晶体管示波器电路图

热门文章

  1. linux mask 特殊权限位,Linux 特殊权限
  2. mysql.sys用户权限_MySQL用户及权限小结
  3. Docker 快速安装 Mysql
  4. 20211130:力扣第267周周赛(下)
  5. 三维点云体素滤波python_三维重建9:点云图像的滤波方法小结
  6. eclipse android 慢,Android编译很慢(使用Eclipse)
  7. flink的watermark简单理解
  8. 【转载】中国煤层气资源量
  9. 深入了解VB中的变量和指针
  10. 使用批处理文件来操作注册表