双下方法:给源码程序员使用,咱们慎用 (以便你们更好的阅读源码)
len
class A(object):
def init(self,name):
self.name = name
print("触发了__init__")
def len(self): # len() 触发
print("走这里")
return len(self.name) # return len("alex") str中__len__
# 必须有返回值,返回值的类型必须是整型
a = A("alexqrqwr")
print(len(a))
str
a = "12345" # str这个类的实例
lst = [1,2,3,4,4,5,5,5,5] # list这个类的实例
print(len(a))
print(len(lst))
hash hash()触发
class A(object):
def init(self,name,age):
self.name = name
self.age = age
def hash(self): # hash()
hash({1,2,345}) # 可变数据类,不可数据类型
# 必须有返回值,返回值的类型必须是整型
a = A("meet",25)
print(hash(a))
str *** Django
class A:
def init(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def str(self): # print 触发 str()
print(111)
return f"姓名:{self.name} 年龄:{self.age} 性别:{self.sex}"
# 必须有返回值,返回值的类型必须是字符串
a = A("meet",20,"男")
a1 = A("meet11",200,"男11")
str(a)
print(a)
print(a1)
a = A("meet",20,"男")
a1 = A("meet2",200,"女")
print(f"姓名:{a.name} 年龄:{a.age} 性别:{a.sex}") # "姓名:meet 年龄:20 性别:男"
print(f"姓名:{a1.name} 年龄:{a1.age} 性别:{a1.sex}") # "姓名:meet2 年龄:200 性别:女"
repr
class A:
def init(self):
pass
def repr(self): # print触发 %r
print(1111)
return "日魔"
def str(self): # str 优先级高于 repr 两个都存在就只执行str
return "宝元"
a = A()
print("%r"%(a))
call *** 面试题
class A:
def init(self):
pass
def call(self, *args, **kwargs): # 对象()时调用的__call__
print("走我")
print(*args, **kwargs)
a = A()
a()
eq # 等于
class A(object):
def init(self,name,age):
self.name = name
self.age = age
def eq(self, other): # a == a1
if self.name == other.name:
return True
else:
return False
a = A("meet",56)
a1 = A("meet",108)
print(a == a1)
del 析构方法
class A:
def init(self):
pass
def del(self): del 触发
print("删除时执行我")
a = A()
import time
time.sleep(5)
del a
a = 1
b = a
a = b
垃圾回收
80 5/s
引用计数
标记清除
分袋回收 袋一:10 2/h 袋二: 5/3 4h 袋三: 3 20h
new 单例模式(面试必问) # 工厂模式 等等
class A(object):
def init(self,name): # 初始化
self.name = name
print("我是__init__,先走我")
def new(cls, *args, **kwargs):
obj = object.new(A)
print("我在哪:",obj)
return obj # obj == init()
# print("我是__new__,先走我")
# return "啦啦啦"
a = A("meet")
print("我是谁:",a)
class A:
def init(self):
print(1111)
a = A()
print(a)
class A(object):
def init(self,name): # 初识化
self.name = name
def new(cls, *args, **kwargs):
obj = object.new(A) # 调用的是object类中的__new__ ,只有object类中的__new__能够创建空间
return obj #本质: obj == init() return init() # 触发了__init__方法
# print("先执行的是我")
# return "宝元"
a = A("meet") # a是对象的内存地址
a1 = A("日魔") # a是对象的内存地址
a2 = A("朝阳") # a是对象的内存地址
print(a.name)
print(a1.name)
print(a2.name)
先执行__new__方法在执行__init__方法
class A:
__a = None #__a = 0x000001F346079FD0
def init(self,name,age):
self.name = name
self.age = age
def new(cls, *args, **kwargs):
if cls.__a is None:
obj = object.new(cls)
cls.__a = obj
return cls.__a
a = A("meet",123) # 0x000001F346079FD0
a1 = A("日魔",11)
print(a.name)
print(a1.name)
单例模式:不管你创建多少次,使用的都是同一个内存空间
模块的导入,手写的单例模式
实例化对象时发生的事
1.创建对象,并开辟对象空间 new
2.自动执行__init__方法
item 可以向操作字典一样操作实例方法
dic["键"] = 值
del dic["键"]
dic["键"]
class A:
def init(self,name,age):
self.name = name
self.age = age
def getitem(self, item):
print(self.dict)
print(self.dict[item]) # self.dict 获取的就是字典
def setitem(self, key, value):
self.dict[key] = value
def delitem(self, key):
del self.dict[key]
a = A("meet",58)
a["sex"] = "男"
a["sex"]
del a["sex"]
print(a.dict)
了解一下上下文
enter
exit
class my_open:
def init(self,file,mode="r",encoding="utf-8"):
self.file = file
self.mode = mode
self.encoding = encoding
def enter(self):
self.f = open(self.file,self.mode,encoding=self.encoding)
return self.f
def exit(self, exc_type, exc_val, exc_tb):
print(exc_type,exc_val,exc_tb) # 没有错误时就是None
self.f.close()
with my_open("a.txt") as ffff:
for i in ffff:
print(i)
print(ffff.read(1111))
print(ffff.read())
with open("a") as f: 使用了上下文