Python学习基础笔记六十三——几个内置方法
内置的类方法和内置的函数之间有着千丝万缕的联系。
1、双下方法:
__str__
__repr__
#str()
#repr()
print(repr(1)) print(repr(1)) print(1, 1)
2、 __len__
len()
3、
class A:
pass
a = A()
print(str(a))
object 里有一个__str__,一旦被调用,就返回调用这个方法的对象的内存地址。
class A:
def __str__(self):
return "As object!"
a = A()
print(a)
打印一个对象的时候,就是调用a.__str__。
4、
class A:
def __str__(self):
return "As object!"
def func(self):
return wahaha
a = A()
print(a)
print(%s:%s%(A, a))
5、
class Teacher:
def __init__(self, name, salary):
self.name = name
self.salary = salary
def __str__(self):
return "Teachers object: %s" % self.name
def __repr__(self):
return str(self.__dict__)
def func(self):
return wahaha
nezha = Teacher(nezha, 250)
print(nezha)
print(repr(nezha))
print(>>> %r % nezha)
str(), 实际上是走的__str__
repr() 实际上是走的__repr__
repr是str的备胎,str不能做repr的备胎。
print(obj)/%s/str(obj)的时候,实际上是内部调用了obj.__str__方法,如果str方法有,返回的是必定是一个字符串。
如果没有__str__方法,会先找到本类中的__repr__方法,再没有再找父类中的__str__方法。
repr(),只会找__repr__, 如果没有就找父类的。
内置方法有很多。
不一定全都在object中。
class A:
def __len__(self):
return 10
a = A()
print(a.__len__())
print(len(a))
class Classes:
def __init__(self, name):
self.name = name
self.student = []
def __len__(self):
return len(self.student)
py_s9 = Classes(Python全栈9)
py_s9.student.append(chang)
py_s9.student.append(jiang)
print(len(py_s9))
__del__析构函数:
析构方法,当对象在内存中被释放时,自动触发执行。
注:此方法无需定义,析构函数的调用都是由解释器在进行垃圾回收时自动触发执行的。
class A:
def __del__(self):
print("执行我啦!")
a = A()
del a # 即执行了这个方法,又删除了变量
print(a)
class A:
def __del__(self):
print("执行我啦!")
a = A()
import time
time.sleep(3)
内部有一个引用计数的机制,
class A:
def __del__(self): # 析构函数
self.f.close() # 收尾工作
a = A()
a.f = open() # 打开文件 第一,在操作系统中打开一个文件 拿到了文件操作符存在内存中
del a # a.f 拿到了文件操作符消失在内存中
__call__方法:
class A:
def __init__(self, name):
pass
def __call__(self):
print("执行我啦!")
a = A(Alex)()
一个对象加上括号,就是调用call方法。
class A:
def __init__(self, name):
self.name = name
def __call__(self):
for k in self.__dict__:
print(k, self.__dict__[k])
a = A(Alex)()
