zoukankan      html  css  js  c++  java
  • Python 第二十六章 面向对象 元类+反射+双下方法

    元类

    class A:
        pass
    obj = A()
    print(type('abc'))
    print(type([1,2,3]))
    print(type((22,33)))
    
    # type 获取对象从属于的类
    print(type(A))
    print(type(str))
    print(type(dict))
    
    # python 中一切皆对象, 类在某种意义上也是一个对象,python中自己定义的类,
    # 以及大部分内置类,都是由type元类(构建类)实例化得来的.
    
    # type 与 object 的关系.
    # print(type(object)) object类是type类的一个实例.
    # object类是type类的父类.
    # print(issubclass(type,object))
    

    反射

    # 程序对自己内部代码的一种自省方式.
    # 反射是什么?  通过字符串去操作对象的方式.
    
    
    # 实例对象.
    # 类.
    # 本模块.
    # 其他模块.
    
    # hasattr,getattr, setattr, delattr
    
    # 实例对象:
    
    # class A:
    #
    #     country = '中国'
    #
    #     def __init__(self,name,age):
    #         self.name = name
    #         self.age = age
    #
    #     def func(self):
    #         print('in A func')
    
    # obj = A('赵海狗',47)
    
    # hasattr
    # print(hasattr(obj,'name'))
    # print(hasattr(obj,'country'))
    # print(hasattr(obj,'func'))
    
    # print(getattr(obj,'name'))
    # print(getattr(obj,'func'))
    # f = getattr(obj,'func')
    # f()
    # print(getattr(obj,'sex',None))
    # if hasattr(obj,'name'):
    #     getattr(obj,'name')
    
    # setattr,delattr 用的很少
    # obj.sex = '公'
    # print(obj.sex)
    # setattr(obj,'sex','公')
    # print(obj.__dict__)
    # delattr(obj,'name')
    # print(obj.__dict__)
    
    
    # 从类的角度:
    
    # class A:
    #
    #     country = '中国'
    #
    #     def __init__(self,name,age):
    #         self.name = name
    #         self.age = age
    #
    #     def func(self):
    #         print(self)
    #         print('in A func')
    #
    # # if hasattr(A,'country'):
    # #     print(getattr(A,'country'))
    #
    #
    # if hasattr(A,'func'):
    #     obj = A('赵海狗', 26)
    #     getattr(obj,'func')()
    #     getattr(A,'func')(obj)
    
    
    # 从其他模块:
    # import tbjx
    # print(getattr(tbjx,'name'))
    # getattr(tbjx,'func')()
    # import tbjx
    # 1. 找到tbjx对象 的C类,实例化一个对象.
    # print(getattr(tbjx,'C'))
    # obj = getattr(tbjx,'C')('123')
    # 2. 找到tbjx对象 的C类,通过对C类这个对象使用反射取到area.
    # print(getattr(tbjx.C,'area'))
    # 3. 找到tbjx对象 的C类,实例化一个对象,对对象进行反射取值.
    # obj = getattr(tbjx,'C')('赵海狗')
    # print(obj.name)
    # print(getattr(obj,'name'))
    # 从当前模块研究反射:
    # a = 666
    #
    # def func1():
    #     print('in 本模块这个对象')
    
    
    # def func1():
    #     print('in func1')
    #
    # def func2():
    #     print('in func2')
    #
    # def func3():
    #     print('in func3')
    #
    # def func4():
    #     print('in func4')
    
    # # func1()
    # # func2()
    # # func3()
    # # l1 = [func1,func2,func3,func4,]
    # import sys
    # # # print(sys.modules[__name__])
    # # print(getattr(sys.modules[__name__],'a'))
    # # getattr(sys.modules[__name__],'func1')()
    # # getattr(sys.modules[__name__],'func2')()
    # # getattr(sys.modules[__name__],'func3')()
    #
    # func_lst = [f'func{i}' for i in range(1,5)]
    # # print(func_lst)
    # for func in func_lst:
    #     getattr(sys.modules[__name__],func)()
    
    
    # class User:
    #     def login(self):
    #         print('欢迎来到登录页面')
    #
    #     def register(self):
    #         print('欢迎来到注册页面')
    #
    #     def save(self):
    #         print('欢迎来到存储页面')
    #
    # choose_dic = {
    #     1: User.login,
    #     2: User.register,
    #     3: User.save,
    # }
    #
    # while 1:
    #     choose = input('请输入序号: 
    1: 登录
    2: 注册
    3: 存储').strip()
    #     obj = User()
    #     choose_dic[int(choose)](obj)
    
    
    # class User:
    #
    #     user_list = [('login','登录'),('register','注册'),('save', '存储')]
    #
    #     def login(self):
    #         print('欢迎来到登录页面')
    #
    #     def register(self):
    #         print('欢迎来到注册页面')
    #
    #     def save(self):
    #         print('欢迎来到存储页面')
    #
    #
    # while 1:
    #     choose = input('请输入序号: 
    1: 登录
    2: 注册
    3: 存储
    ').strip()  # 1
    #     obj = User()
    #     getattr(obj, obj.user_list[int(choose)-1][0])()  # getattr(obj,'login')
    
    

    函数与方法

    def func1():
        pass
    
    class A:
        def func(self):
            pass
    
    # 1. 通过打印函数名的方式区别什么是方法,什么是函数. (了解)
    # print(func1)
    # print(A.func)  # 通过类名调用的类中的实例方法叫做函数.
    # obj = A()
    # print(obj.func) # 通过对象调用的类中的实例方法叫方法.
    
    # 2 可以借助模块判断是方法还是函数.
    
    # from types import FunctionType
    # from types import MethodType
    #
    # def func():
    #     pass
    #
    #
    # class A:
    #     def func(self):
    #         pass
    #
    # obj = A()
    
    
    # print(isinstance(func,FunctionType))  # True
    # print(isinstance(A.func,FunctionType))  # True
    # print(isinstance(obj.func,FunctionType))  # False
    # print(isinstance(obj.func,MethodType))  # True
    # 总结:
    # python 中一切皆对象, 类在某种意义上也是一个对象,python中自己定义的类,
    # 以及大部分内置类,都是由type元类(构建类)实例化得来的.
    # python 中一切皆对象, 函数在某种意义上也是一个对象,函数这个对象是从FunctionType这个类实例化出来的.
    # python 中一切皆对象, 方法在某种意义上也是一个对象,方法这个对象是从MethodType这个类实例化出来的.
    
    
    class A:
        @classmethod
        def func(cls,a):
            pass
    
        @staticmethod
        def func1():
            pass
    
    # A.func(222)
    # A.func()
    # obj = A()
    # obj.func()
    
    # 总结: 如何判断类中的是方法还是函数.
    # 函数都是显性传参,方法都是隐性传参.
    
    

    双下方法

    # 特殊的双下方法: 原本是开发python这个语言的程序员用的.源码中使用的.
    # str : 我们不能轻易使用.慎用.
    # 双下方法: 你不知道你干了什么就触发某个双下方法.
    
    # __len__
    
    
    # class B:
    #
    #     def __init__(self,name,age):
    #         self.name = name
    #         self.age =age
    #
    #     def __len__(self):
    #         print(self.__dict__)
    #
    #         return len(self.__dict__)  # 2
    #
    # b = B('leye',28)
    #
    # print(len(b))
    
    # dict
    # print(len({'name': 'leye', 'age': 28}))
    
    
    # class A(object):
    #
    #     pass
    #
    # obj = A()
    
    # print(hash(obj))
    # str
    # print(hash('fdsaf'))
    
    
    # ***
    
    # class A:
    #
    #     def __init__(self,name,age):
    #         self.name = name
    #         self.age =age
    #
    #     def __str__(self):
    #         print(666)
    #         return f'姓名: {self.name} 年龄: {self.age}'
    #
    # a = A('赵海狗',35)
    # b = A('李业',56)
    # c = A('华丽',18)
    # 打印对象触发__str__方法
    # print(f'{a.name}  {a.age}')
    # print(f'{b.name}  {b.age}')
    # print(f'{c.name}  {c.age}')
    # print(a)
    # print(b)
    # print(c)
    # 直接str转化也可以触发.
    # print(str(a))
    
    # repr
    # print('我叫%s' % ('alex'))
    # print('我叫%r' % ('alex'))
    # print(repr('fdsaf'))
    
    
    # class A:
    #
    #     def __init__(self,name,age):
    #         self.name = name
    #         self.age =age
    #
    #     def __repr__(self):
    #         print(666)
    #         return f'姓名: {self.name} 年龄: {self.age}'
    #
    # a = A('赵海狗',35)
    # b = A('李业',56)
    # c = A('华丽',18)
    # # print(a)
    # print(repr(a))
    
    
    # class A:
    #
    #     def __init__(self,name,age):
    #         self.name = name
    #         self.age =age
    #
    #     def __str__(self):
    #         return '777'
    #
    #
    #     def __repr__(self):
    #         return '666'
    #
    # a = A('赵海狗',35)
    # b = A('李业',56)
    # c = A('华丽',18)
    # # print(a)
    # print(a)
    
    # __call__方法  ***
    # 对象() 自动触发对象从属于类(父类)的__call__方法
    # class Foo:
    #
    #     def __init__(self):
    #         pass
    #
    #     def __call__(self, *args, **kwargs):
    #         print('__call__')
    #
    # obj = Foo()
    # obj()
    
    
    # __eq__
    # class A(object):
    #     def __init__(self):
    #         self.a = 1
    #         self.b = 2
    #
    #     def __eq__(self,obj):
    #         # if  self.a == obj.a and self.b == obj.b:
    #         #     return True
    #         return True
    # x = A()
    # y = A()
    # print(x == y)
    # x = 1
    # y = 2
    # print(x+y)
    # __del__析构方法
    
    # class A:
    #
    #     def __del__(self):
    #         print(666)
    #
    # obj = A()
    # del obj
    
    # __new__ *** new一个对象  构造方法
    
    
    class A(object):
    
        def __init__(self):
    
            self.x = 1
            print('in init function')
    
        def __new__(cls, *args, **kwargs):
            print('in new function')
            return object.__new__(A)  # object 342534
    
    # # 对象是object类的__new__方法 产生了一个对象.
    a = A()
    
    # 类名()
    # 1. 先触发 object的__new__方法,此方法在内存中开辟一个对象空间.
    # 2. 执行__init__方法,给对象封装属性.
    
    # print(a)
    
    # python中的设计模式: 单例模式
    
    # 一个类只允许实例化一个对象.
    # class A:
    #
    #     pass
    # obj = A()
    # print(obj)
    # obj1 = A()
    # print(obj1)
    # obj2 = A()
    # print(obj2)
    
    # 手写单例模式
    # class A:
    #     __instance = None
    #
    #     def __init__(self,name):
    #         self.name = name
    #
    #     def __new__(cls,*args,**kwargs):
    #         if not cls.__instance:
    #             cls.__instance = object.__new__(cls)
    #         return cls.__instance
    #
    #
    # obj = A('alex')
    # print(obj)
    # obj1 = A('李业')
    # print(obj1.name)
    # print(obj.name)
    
    
    
  • 相关阅读:
    无线网络安全标准是什么?漏洞是怎样产生的
    揭秘英特尔处理器如何启动?
    数据包级网络遥测和网络安全推送分析
    自动化与网络工程之间的关系
    ElementUI中的el-table中实现动态添加一行、删除一行、清空所有行
    ElementUI中的el-table实现多选框不勾选的提示
    Nodejs中的fs模块的使用
    ElementUI中的el-table怎样实现多选与单选
    MyBatis中针对if-test的参数为指定值的xml写法
    SqlServer中怎样从Excel中导入数据
  • 原文地址:https://www.cnblogs.com/zhangshan33/p/11354771.html
Copyright © 2011-2022 走看看