python第十三节(面向对象4)

面向对象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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值