双下方法:给源码程序员使用,咱们慎用 (以便你们更好的阅读源码)
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 "宝元"