def datetime1(self):
print('time')
a1 = A()
# 通过反射从对象获取属性
b = getattr(a1, 'local')
# 通过反射从类中拿属性
c = getattr(A, 'local')
# 通过反射从对象中拿方法
d = getattr(a1, 'datetime1')
# 通过反射从模块中拿到类B
B = getattr(m1,'B')
print(hasattr(m1,'B'))
e = B()
8.特殊双下方法
__str__与__repr__ ,不太理解,但是都可以把对象的内存地址转为可读字符串
__call__方法 ,当对象 + () 的情况就会执行 __call__方法
class A:
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
def __call__(self, *args, **kwargs):
print(args, kwargs)
return args, kwargs
def __repr__(self):
return '有str就不会执行repr'
a1 = A('lucy')
# 执行对象的__str__方法
print(a1)
# 执行__call__方法
a1(1, 2, 3, n=1, m=2)
# 直接执行对象的__repr__方法
print(repr(a1))
# 查看对象有多少个方法
print(dir(a1))
__new__方法 ,new方法是object基类中的方法 ,是构造方法 ,开辟内存 ,创建对象
class A:
def __new__(cls, *args, **kwargs):
print('1')
cls.name = 'LOP'
return object.__new__(cls) # 引用obeject的c语言创建对象功能
def __init__(self):
print('2')
# 第一步执行__new__方法中的内容,将返回值给对象名a1
# 第二步执行__init__初始化对象
a1 = A()
print(a1.name)
a2 = A()
print(a1 is a2) # False 两个对象各用内存
##单例模式##
class A:
__instance = None
def __new__(cls, *args, **kwargs):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
# __instance从此记录单例对象的内存
return cls.__instance
a1 = A()
a2 = A()
print(a1 is a2)