类的内置方法
  它与内置函数有紧密的联系,有的内置函数就是调用的内置方法。
  在顶级父类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. acwing 55. 连续子数组的最大和

    地址  https://www.acwing.com/problem/content/50/ 输入一个 非空 整型数组,数组里的数可能为正,也可能为负. 数组中一个或连续的多个整数组成一个子数组. 求 ...

  2. 题解:A

    A (a.pas/c/cpp) [题目描述] 对于给定的一个正整数n, 判断n是否能分成若干个正整数之和 (可以重复) , 其中每个正整数都能表示成两个质数乘积. [输入描述] 第一行一个正整数 q, ...

  3. CF53E Dead Ends

    CF53E Dead Ends 洛谷评测传送门 题目描述 Life in Bertown has become hard. The city has too many roads and the go ...

  4. python做中学(六)os.getcwd() 的用法

    概述 os.getcwd() 方法用于返回当前工作目录. 语法 getcwd()方法语法格式如下: os.getcwd() 参数 无 返回值 返回当前进程的工作目录. 实例 以下实例演示了 getcw ...

  5. 记一个bootstrap定制container导致页面X轴出现横向滚动条的坑

     壹 ❀ 引 在bootstrap定制时,因为UI给的图纸的页面主体部分宽度为1200px,所以我将container容器宽度从默认的1170px改成了1200px,随后在页面缩小的调试过程中发现了页 ...

  6. 【OCR技术系列之二】文字定位于切割

    要做文字识别,第一步要考虑的就是怎么将每一个字符从图片中切割下来,然后才可以送入我们设计好的模型进行字符识别.现在就以下面这张图片为例,说一说最一般的字符切割的步骤是哪些. 当然,我们实际上要识别的图 ...

  7. IT兄弟连 HTML5教程 HTML5和CSS3的关系

    HTML5是第五版HTML的标准,CSS3则是第三版CSS,新增一些非常实用的选择器和样式属性,并且CSS3语言开发是朝着模块化发展的.以前的规范作为一个模块实在是太庞大而且比较复杂,所以,把它分解为 ...

  8. Java泛型类型擦除与运行时类型获取

    Java的泛型大家都知道是类型擦除的方式实现的,“编译器会进行泛型擦除”是一个常识了(实际擦除的是参数和自变量的类型).“类型擦除” 并非像许多开发者认为的那样,在 <..> 符号内的东西 ...

  9. C++ 类的前向声明的用法

    我们知道C++的类应当是先定义,然后使用.但在处理相对复杂的问题.考虑类的组合时,很可能遇到俩个类相互引用的情况,这种情况称为循环依赖. 例如: class A { public: void f(B ...

  10. C#数组3(可变数组)

    using System; namespace class1 { class program { static void Main(string[] args) { ][];//这里的行必须定义好,但 ...