面向对象4
特殊成员和魔法方法
Python中有大量类似__init__这种以双下划线开头和结尾的特殊成员及“魔法方法”,它们有着非常重要的地位和作用,也是Python语言独具特色的语法之一!
__doc__
打印类的说明文档
str()
print(str().__doc__)
class Demo(object):
'''
我是Demo类的注释
'''
# '我...'
# "i am"
pass
d = Demo()
print(d.__doc__)
__init__()
实例化方法,通过类创建实例时,自动触发执行
__del__()
析构方法,当对象在内存中被释放时,自动触发此方法。
1.全部代码执行完毕,自动触发__del__
2.del对象,主动触发__del__
3.仅有对象全部被释放,才会主动触发__del__
class Demo: # 到所有语句都触发完毕后再出发魔法方法
def __del__(self):
print("我被回收了")
d = Demo()
d1 = d
print('-'*10)
del d
del d1
print('-'*10)
__call__()
如果为一个类编写了该方法,那么在该类的实例后面加括号,可会调用这个方法。
class Demo:
def __call__(self, *args, **kwargs):
print('我可以调用了噢')
d = Demo()
d()
__dict__
列出类或对象中的所有成员!非常重要和游泳的一个属性。
class Demo:
def __init__(self):
self.name = 'amy'
self.__age = 18
def test(self):
print('我是test')
d = Demo()
print(d.__dir__()) # list 返回是对象的所有成员
print(d.__dict__) # dict 返回对象的属性
print(Demo.__dict__) # dict 返回类的方法以及内存地址
__new__()
__new__()方法是在类准备将自身实例化时调用
1.通过__new__()方法创建对象
2.并将对象返回出来给d
3.实例化对象自动触发__init__方法
class Demo(object):
def __init__(self):
print('__init__')
def __new__(cls, *args, **kwargs):
print('__new__')
# return super().__new__(cls)
d = Demo()
'''
1.通过__new__()方法创建对象
2.并将对象返回出来给d
3.实例化对象自动触发__init__方法
__init__(),__new__()区别
1.__init__()实例方法,__new__()静态方法
2.__init__()在对象创建后自动调用,__new__()创建对象的方法
'''
单例模式
单例模式
python的单例模式就是一个类的实例只能自始自终自能创建一次。应用场景比如说数据库的连接池。
单例模式的来历
在面向对象的程序设计中,当业务开发量非常大时,那么就会出现重复创建相同的对象,每创建一个对象就会开辟一块内存空间,而这些对象其实是一模一样的,有没有办法使用的内存对象只创建一次,然后随处使用呢?单例模式就是为了解决这个问题而产生。
# class Demo:
# pass
# d = Demo() # d是对象,实例
# print(id(d))
# d1 = Demo()
'''
标志来记录是否已经创建
当对象不存在-->创建对象
当对象已存在-->永远只返回当前已经创建对象
'''
class Single(object):
__isinstance = None
def __new__(cls, *args, **kwargs):
if cls.__isinstance is None:
cls.__isinstance = super().__new__(cls)
return cls.__isinstance
else:
return cls.__isinstance
d = Single() # d是对象,实例
print(id(d))
d1 = Single()
print(id(d1))
reflect反射
def func():
print('def')
#func()
s = 'func'
# s() # TypeError: 'str' object is not callable 'str'不可调用
先新建views.py,代码如下:
def login():
print('登陆页面')
def signup():
print('注册页')
def home():
print('主页')
后在同一个目录下,再新建urls.py,代码如下:
'''
实现:
用户输入Login
-->print("登陆页面")
需要判断 是否带有http:或https:的路由
url是网址 路由器 服务器地址
'''
'''
1.输入ipt的格式 模块名/函数名
2.拆分模块名/函数名-->ipt.split('/')
'''
# import views
# __import__()
def run():
ipt = input("请输入你想访问的页面:").strip()
# strip() 返回字符串的一个副本,并删除开头和结尾的空白。
# res = ipt.split('/') # ['views', 'login']
modules,func = ipt.split('/')
# print(modules,func)
obj = __import__(modules) # __import__导入modules模块,没有导入就不行
# print(obj) # <module 'views' from 'D:\\python文件\\20200205\\第十三节\\views.py'>
# print(res)
# getattr(x,'y')-->x,y
if hasattr(obj,func): # 返回对象是否具有给定名称的属性。
func = getattr(obj,func) # views.login
# hasattr()
func() # views.login()
else: # else 只是判断 func不存在可以执行,是在modules没存在的时候会报错
print('404')
# if ipt == 'login':
# views.login()
# elif ipt == 'signup':
# views.signup()
# elif ipt == 'index':
# views.index()
# else:
# print('404')
run()