类的内置方法
  它与内置函数有紧密的联系,有的内置函数就是调用的内置方法。
  在顶级父类obj中有:
  两个双下方法
    obj.__str__ str(obj)
    obj.__repr__ repr(obj)

1、__str__ 与 __repr__

 class Teacher:
def __init__(self, name, salary):
self.name = name
self.salary = salary def __str__(self):
return "Teacher's object :%s" % self.name def __repr__(self):
return str(self.__dict__) def func(self):
return 'wahaha' nezha = Teacher('哪吒', 250)
print(nezha) # 打印一个对象的时候,就是调用a.__str__
print(repr(nezha))
print('>>> %r' % nezha)
a.__str__ --> object
object 里有一个__str__,一旦被调用,就返回调用这个方法的对象的内存地址
l = [1,2,3,4,5] # 实例化 实例化了一个列表类的对象
print(l)
%s str() 直接打印 实际上都是走的__str__
%r repr() 实际上都是走的__repr__
repr 是str的备胎,但str不能做repr的备胎
print(obj)/'%s'%obj/str(obj)的时候,实际上是内部调用了obj.__str__方法,如果str方法有,那么他返回的必定是一个字符串
如果没有__str__方法,会先找本类中的__repr__方法,再没有再找父类中的__str__。
repr(),只会找__repr__,如果没有找父类的
内置的方法有很多,但是不一定全都在object中
 class Classes:
def __init__(self, name):
self.name = name
self.student = [ ] def __len__(self):
return len(self.student) # obj中没有该方法,因为obj只存所有对象共有的! def __str__(self):
return 'classes' py_s9 = Classes('九年级三班')
py_s9.student.append('董青')
py_s9.student.append('久美')
print(len(py_s9))
print(py_s9) # 1、__str__
print(str(12)) # 其实就是调用int类型的__str__方法 # 为了验证,可以来一个例子:
class StrDemo:
def __init__(self, name):
self.name = name # def __str__(self):
# print('调用我的str双下方法了!')
# return self.name
def __repr__(self):
print('调用我的repr双下方法了!')
return self.name s = StrDemo("string")
print(str(s)) # 2、__repr__
print(repr(''))
print(repr(1))
# 我们将StrDemo类中的__str__方法注释掉,看看发生什么?
print(repr(s)) # 当一个类没有重写__str__方法,但是重写了__repr__方法,当使用str(本类实例)的时候,就调用了__repr__
# 即__repr__是__str__的备胎,但是反过来就不行!

2、析构函数(__del__)

功能是在回收内存中的对象,并在回收前做一些收尾工作,如打开的文件没关闭,将其关闭等!
 class A:
def __init__(self, f):
self.f = f def __del__(self):
print('it deling')
self.f.close() # 析构函数: 在删除一个对象之前进行一些收尾工作 a = A(open('2_反射进阶.py'))
del a # del 既执行了这个方法,又删除了变量 # del a NameError: name 'a' is not defined # 引用计数中用到该内置方法

3、item相关方法:__getitem__    __setitem__    __delitem__

 class Person:
def __init__(self, name,age,ginder):
self.name = name
self.age = age
self.ginder = ginder def __getitem__(self, item):
if hasattr(self, item):
return self.__dict__[item] def __setitem__(self, key, value):
self.__dict__[key] = value def __delitem__(self, key):
print('it is calling me !')
self.__dict__.pop(key) tom = Person('tom', 22, 'male')
# 得到属性
print(tom['ginder']) # __getitem__可以用访问字典中的元素一样访问对象的属性!
# 设置属性
tom['kind'] = 'superman'
print(tom.kind, tom['kind'])
#del tom.kind # object 原生支持 __delattr__
del tom['kind'] # 通过自己实现的
print(tom.kind, tom['kind'])

4、__hash__        对应 hash()内置函数   

查看hash值,可以修改hash规则,是的本来有不同hash值的两个对象有一样的hash值

 lass Hash:
def __init__(self, name):
self.name = name def __hash__(self):
return hash(self.name) ha_a = Hash('a_Hash')
hah = Hash('a_Hash')
print(hash(ha_a), hash(hah)) # 两个对象虽然名字一样,但是hash值不同:-9223371888545262739 148309513073
# 实现object中的__hash__方法,并只返回name的hash值,就相等了:-9184190014575666570 -9184190014575666570

5、__new__ 构造函数,在初始化函数前,将self构造出来。
  典型使用:单例模式(23种设计模式第一个)
  即:一个类在内存中,始终只有一个实例

  __init__ 初始化方法
  __new__ 构造方法 : 创建一个对象

 class Singleton():
__instance = False
def __init__(self, name):
self.name = name def __new__(cls, *args, **kwargs):
'''实现单例'''
if cls.__instance:
return cls.__instance
else:
cls.__instance = object.__new__(cls)
return cls.__instance a = Singleton('a')
a.nm = '单例'
b = Singleton('b')
print(b.nm)
print(id(a), id(b)) # 没有实现__new__方法前的结果是:2681905465888 2681905467232 地址不同,说明是两个对象
# __实现__new__方法后,即使不写具体操作,直接pass,也返回相同的地址:1760945392 1760945392
# 实现单例的操作后,地址变为:2491487242000 2491487242000 还是相同,即为同一对象!

6、 __eq__方法

 class Equal:
def __init__(self, name):
self.name = name def __eq__(self, other):
if self.name == other.name:
return True double_eq = Equal('双等于号')
eq = Equal('双等于号')
# 问:两个对象相等吗?
print(double_eq, eq, double_eq == eq)
# <__main__.Equal object at 0x0000027726CA3828> <__main__.Equal object at 0x0000027726CA3860> False
# 内存地址不一样,是两个对象,所以不等,双下eq方法,是继承自顶级的object类,原来就是比较内存地址的!
# 实现该方法的其他类,如str,int等,改为值等就是相等了!
# 如何让两个相同的名字的Equal对象,变为相等了?只有重写eq方法了
print(double_eq == eq)

7、__call__ 方法

 class B:
def __init__(self, name):
self.name = name def __call__(self):
for k in self.__dict__:
print(k, self.__dict__[ k ]) B('sb')() # 最后一个()就是在调用该类中的双下call方法!

Python进阶-XVIV 类的内置方法:__str__ 、__repr__、析构函数(__del__)、双下的call,eq,new,hash 以及item相关的三个方法的更多相关文章

  1. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  2. Python进阶之浅谈内置方法(补充)

    目录 列表类型的内置方法 元组类型的内置方法 字典类型的内置方法 集合类型的内置方法 列表类型的内置方法 1.作用:描述名字,说的话等 2.定义方式 s=['tim','age'] s=str('ti ...

  3. Python进阶之浅谈内置方法

    目录 有序or无序和可变or不可变 数字类型内置方法 整形 浮点型 字符串类型内置方法 有序or无序和可变or不可变 有序:有索引 无序:无索引 可变:变量值变,id不变 不可变:变量值变,id也变 ...

  4. python进阶之py文件内置属性

    前言 对于任何一个python文件来说,当python解释器运行一个py文件,会自动将一些内容加载到内置的属性中:一个模块我们可以看做是一个比类更大的对象. 查看模块的内置属性 我们先创建一个典型的p ...

  5. python基础(14)-反射&类的内置函数

    反射 几个反射相关的函数可参考python基础(10)-匿名函数&内置函数中2.2.4反射相关 类的一些内置函数 __str__()&__repr__() 重写__str__()函数类 ...

  6. Python学习day08-python进阶(2)-内置方法

    Python学习day08-python进阶(2)-内置方法 列表数据类型内置方法 作用 描述多个值,比如爱好 定义方法       xxxxxxxxxx 2         1 hobby_list ...

  7. python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法

    一. 反射 ''' # isinstance class A:pass class B(A):pass a = A() print(isinstance(a,A)) # 判断对象和类的关系 print ...

  8. python基础语法18 类的内置方法(魔法方法),单例模式

    类的内置方法(魔法方法): 凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,也称之为魔法方法. 类的内置方法,会在某种条件满足下自动触发. 内置方法如下: __new__: 在__ini ...

  9. python -- 类中--内置方法

    isinstance 和  issubclass isinstance(obj,b)  检查是否obj是否是类b的对象 class A(object):pass class B(A):pass b=B ...

随机推荐

  1. Re-py交易

    python在线反编译 https://tool.lu/pyc/ 获得源码 import base64 def encode(message): s = '' for i in message: x ...

  2. python中copy()和deepcopy()详解

    **首先直接上结论: —–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在.所以改变原有被复制对象不会对已经复制出来的新对象产生影响.—–而浅复制并不会产生一个独立的 ...

  3. JVM的类加载过程以及双亲委派模型详解

    JVM的类加载过程以及双亲委派模型详解 这篇文章主要介绍了JVM的类加载过程以及双亲委派模型详解,类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象 ...

  4. 题解:swj社会摇成佛第六课

    题目链接 solution: dp f[i]表示lhy小伙身长为i,能砍得的最优解 f[i]=f[j]*f[i-j]; public class CuttingRope01 { public stat ...

  5. seq参数 RANDOM 参数 openssl参数 cut参数

    #seq命令用于以指定增量从首数开始打印数字到尾数 语法: [2] seq [选项] 首数 尾数 [3] seq [选项] 首数 增量 尾数选项: seq 实例 一 存入数据库 然后 输出数据库的代码 ...

  6. python进阶之垃圾回收

    内存使用: 程序在运行的过程需要开辟内存空间,比如创建一个对象需要一片内存空间,定义变量需要内存空间.有内存的开辟,势必也要有内存的释放,不然只进不出那不是貔貅了吗?即使有开辟有释放在短期内还是会有垃 ...

  7. .NET Core NuGet 多项目套餐打包的正确姿势

    NuGet 默认只支持一个菜一个菜打包,不支持套餐打包.当对一个 csproj 项目进行 nuget 打包时(比如使用 dotnet pack 命令),只会将当前项目 build 出来的 dll 程序 ...

  8. 【C#】C#获取本地的内网(局域网)和外网(公网)IP地址的方法

    1.获取本机的IP地址集合: /// <summary> /// 获取本机所有ip地址 /// </summary> /// <param name="netT ...

  9. 【STM32H7教程】第17章 STM32H7之GPIO的HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第17章       STM32H7之GPIO的HAL库API ...

  10. 策略路由PBR(不含track)

    策略路由:是一种依据用户制定的策略进行路由选择的机制.(公义)在特定数据进入路由表前,对其进行操控的方式.(本人定义) 根据作用对象的不同,策略路由可分为本地策略路由和接口策略路由: · 本地策略路由 ...