标签:class return 思考 main code 打印 har 开头 很多
class Mycalss(object):
def __init__(self, name):
print("这个是init方法")
self.name = name
# 重写 __new__方法
def __new__(cls, *args, **kwargs):
print("这个是new方法")
# 创建对象是python底层帮我实现,重写之后需要返回父类的创建对象的方法,不然实例不出对象
return object.__new__(cls)
m = Mycalss("DaBai") # 先进入new方法 在执行init方法
class Mycalss(object):
instance = None
# 重写 __new__方法
def __new__(cls, *args, **kwargs):
# 如果 instance 为None 实例化对象,否则用第一次实例的对象
if not cls.instance:
cls.instance = object.__new__(cls)
return cls.instance
else:
return cls.instance
m1 = Mycalss()
m2 = Mycalss()
# id 一样 同一个对象
print(id(m1))
print(id(m2))
# 所以m1创建的属性,m2一样有
m1.name="DaBai"
print(m2.name)
# 装饰器单例模式
def class_one_case(cls):
# 空字典储存 类 和 类实例(key:value)
instace = {}
def inner(*args, **kwargs):
# 如果类不在字典中实例化对象储存,否者用字典中的对象
if cls not in instace:
instace[cls] = cls(*args, **kwargs)
return instace[cls]
else:
return instace[cls]
return inner
@class_one_case
class TestClass(object): # TestClass=class_one_case(TestClass) 调用的时候执行的装饰器内部inner方法,返回实例
name = ""
def run(self):
print(self.name)
t1 = TestClass()
t2 = TestClass()
print(id(t1))
print(id(t2))
t1.name="Dabai"
# t2 就是t1 name 属性也都公共也变成"DaBai"
t2.run()
>>> a = "1"
>>> print(a)
1
>>> a
'1'
>>>
a = "123"
print(str(a)) # 123
print(format(a)) # 123
print(repr(a)) # '123'
class MyStrRepr(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def __str__(self):
print("出发__str__方法")
return self.name # 不返回 或者返回的类型不是字符串的时候会报错
def __repr__(self):
print("出发__repr__方法")
return "MySrtRepr.object.name-%s" % self.gender
s = MyStrRepr("DaBai", "男")
print(s) # print 触发__str方法
str(s) # srt 触发__srt__
format(s) # format 触发__srt__
res = repr(s) # repr 触发__repr__ 程序员输出方式
print(res)
# __call__ 可以被调用的方法 像函数一样加() 可以被调用,
# 实例不能被调用是因为 实例和函数底层实现的方法不一样
# 函数底层实现的call方法
def fun():
print("函数")
class My(object):
def __init__(self, name):
print("这个是init方法")
self.name = name
print("函数内部实现的方法", dir(fun)) # 实现了'__call__'
m1 = My("DaBai")
print("实例实现的方法", dir(m1)) # 没有实现__call
m1() # 被执行会报错
class My(object):
def __call__(self, *args, **kwargs):
print("__实例被执行了__")
m = My()
m() # 不会报错 会执行类中__call__方法内的代码块
# 类装饰器
class MyCall(object):
def __init__(self, fun_cls):
# print("这个是init方法")
self.fun_cls = fun_cls
def __call__(self, *args, **kwargs):
print("call方法")
return self.fun_cls(*args, **kwargs)
@MyCall
def fun(a): # fun = Mycall(fun) 此时的fun 是 Mycall的实例对象了,被调用时执行call方法
print("函数%s" % a)
@MyCall
class My(object): # My = Mycall(My) 此时的My 是 Mycall的实例对象了,被调用时执行call方法
def __init__(self, name):
self.name = name
print(fun) # <__main__.MyCall object at 0x0000022ECE480320> MyCall的实例对象
fun(1) # 实例被执行 执行的call方法,call方法里面执行了run()函数
print(My) # <__main__.MyCall object at 0x0000012B8FDB03C8> MyCall的实例对象
m = My("DaBai") # MyCall的实例对象执行call方法 返回 My类的实例对象
print(m) # <__main__.My object at 0x0000012B8FDB0470> My的实例对象
标签:class return 思考 main code 打印 har 开头 很多
原文地址:https://www.cnblogs.com/jiangmingbai/p/10909449.html