zoukankan      html  css  js  c++  java
  • python_day21面向对象的进阶(反射,内置方法,)

    # 两个内置函数 *
    # 反射 *****
    # 内置方法 ***


    # 类(定义)
    # 静态属性 类属性(变量) 直接写在类中,全大写
    # 动态属性 方法(函数) self
    # 类方法 @classmethod cls
    # 静态方法 @staticmethod 没有默认参数
    # 选课系统 专门给面向对象编程的时候 的函数准备的
    # 特性 @property
    # class Person:
    # @staticmethod
    # def login():
    # pass
    # class Teacher(Person):
    # pass

    # 调用
    # 对象名.动态属性()/类名.动态属性(对象)
    # 类名.静态属性/对象名.静态属性
    # 类名.类方法()/对象名.类方法()
    # 类名.静态方法/对象名.静态方法()

    # 对象的命名空间中能存的:
    # 属性
    # 对象能调用的:
    # 对象属性
    # 类中的普通方法

    # 私有的
    # __名字
    # 静态属性
    # 动态属性
    # 类方法
    # 静态方法
    # 属性
    # 私有的有什么特点
    # 只能在类的内部调用
    # 不能被继承
    # 什么时候用私有的?
    # 当不想被外部调用也不想被继承,只想在类内部使用的时候
    # 当在外部使用的时候,想给用户的使用前后直接加上某些功能
    # 私有 + property使用

    # 3w1h
    # what 这个东西是什么
    # where 在哪儿用
    # why 为什么这么用
    # how 怎么用



    -----------------------------------------------内置函数--------------------------------------

    # isinstance()  判断对象所属类型,包括继承关系
    # issubclass() 判断类与类之间的继承关系

    # class A:pass
    # class B(A):pass
    # b = B()
    # print(isinstance(b,B)) #o,t
    # print(isinstance(b,A)) #o,t
    # l = list()
    # print(l) # type(l)
    # class mystr(str):pass
    # ms = mystr('alex')
    # print(ms)
    # print(type(ms) is str) # 不包含继承关系,只管一层
    # print(isinstance('alex',str)) # 包含所有的继承关系


    # == 值相等 值运算
    # is 内存地址相等 身份运算
    # is要求更苛刻
    # 不仅要求值相等,还要求内存地址相同

    # a = 1111
    # b = 1111
    # a == b
    # a is b

    # issubclass
    # class A:pass
    # class B(A):pass
    # print(issubclass(B,A))
    # print(issubclass(A,B))




    ---------------------------------------------反射------------------------------------------------------------
    
    
    # 什么是反射?
    # 用字符串数据类型的变量名来访问这个变量的值
    # 反射的方法: getattr hasattr setattr delattr

    # class Student:
    # def __init__(self,name):
    # self.name = name
    # def check_course(self):
    # print('check_course')
    # def choose_course(self):
    # print('choose_course')
    # def choosed_course(self):
    # print('查看已选择的课程')
    # stu = Student()
    # num = input('>>>')
    # if num == 'check_course':
    # stu.check_course()
    # elif num == 'choose_course':
    # stu.choose_course()
    # elif num == 'choosed_course':
    # stu.choosed_course()

    # eval 这个东西 明确的写在你的代码里

    # 类 静态属性 类方法 静态方法
    # 命名空间.XXX == getattr(命名空间,'XXX')
    # class Student:
    # ROLE = 'STUDENT'
    # @classmethod
    # def check_course(cls):
    # print('查看课程了')
    #
    # @staticmethod
    # def login():
    # print('登录')
    # # 反射查看属性
    # # print(Student.ROLE)
    # # print(getattr(Student,'ROLE'))
    #
    # # 反射调用方法
    # # getattr(Student,'check_course')() # 类方法
    # # getattr(Student,'login')() # 静态方法
    #
    # num = input('>>>')
    # if hasattr(Student,num):
    # getattr(Student,num)()

    # 对象
    # 方法 对象属性
    # class A():
    # def __init__(self,name):
    # self.name = name
    #
    # def func(self):
    # print('in func')
    #
    # a = A('alex')
    # print(a.name)
    # print(getattr(a,'name'))
    # getattr(a,'func')()

    # 模块
    # import os # 别人写好的python代码的结合
    # # os.rename('__init__.py','init')
    # # getattr(os,'rename')('init','__init__.py') # == os.rename
    # rename = os.rename
    # rename2 = getattr(os,'rename')
    # rename2('__init__.py','init') # os.rename('__init__.py','init')
    # rename('init','init2') # os.rename('init','init2')

    # def wahaha():
    # print('wahaha')
    #
    # def qqxing():
    # print('qqxing')

    # 反射自己模块中的内容 找到自己当前文件所在的命名空间
    # wahaha()
    # qqxing()

    # import sys
    # print(sys.modules)
    # import 都相当于导入了一个模块
    # 模块哪个导入了 哪个没导入 在我的python解释器里应该记录下来
    # import sys 是一个模块,这个模块里的所有的方法都是和python解释器相关的
    # sys.modules 这个方法 表示所有在当前这个python程序中导入的模块
    # '__main__': <module '__main__' from 'D:/sylar/python_workspace/day20/4.反射.py'>
    # print(sys.modules['__main__'])
    # my_file = sys.modules['__main__']
    # my_file.wahaha()
    # my_file.qqxing()
    # # 'qqxing'
    # # 'wahaha'
    # getattr(my_file,'wahaha')()
    # getattr(my_file,'qqxing')()


    # 反射
    # hasattr,getattr
    # 类名.名字
    # getattr(类名,'名字')
    # 对象名.名字
    # getattr(对象,'名字')
    # 模块名.名字
    # import 模块
    # getattr(模块,'名字')
    # 自己文件.名字
    # import sys
    # getattr(sys.modules['__main__'],'名字')






    ------------------------------------------------内置方法-------------------------------------------------------
    # __名字__
    # 类中的特殊方法内置方法
    # 双下方法
    # 魔术方法 magic_method
    # 类中的每一个双下方法都有它自己的特殊意义

    # __call__ 相当于 对象()
    # __len__ len(obj)
    # __new__ 特别重要 开辟内存空间的 类的构造方法
    # 写一个单例类=
    # __str__ str(obj),'%s'%obj,print(obj)

    # 所有的双下方法 没有 需要你在外部直接调用的
    # 而是总有一些其他的 内置函数 特殊的语法 来自动触发这些 双下方法


    # __call__ flask
    # class A:
    # def __call__(self, *args, **kwargs):
    # print('执行call方法了')
    # def call(self):
    # print('执行call方法了')
    # class B:
    # def __init__(self,cls):
    # print('在实例化A之前做一些事情')
    # self.a = cls()
    # self.a()
    # print('在实例化A之后做一些事情')
    # a = A()
    # a() # 对象() == 相当于调用__call__方法
    # a.call()

    # A()() # 类名()() ,相当于先实例化得到一个对象,再对对象(),==>和上面的结果一样,相当于调用__call__方法
    # B(A)

    # __len__
    # 内置函数和类的内置方法是由奸情的
    # len(dict)
    # len(tuple) str list set
    # class mylist:
    # def __init__(self):
    # self.lst = [1,2,3,4,5,6]
    # self.name = 'alex'
    # self.age = 83
    # def __len__(self):
    # print('执行__len__了')
    # return len(self.__dict__)
    #
    # l = mylist()
    # print(len(l))
    # len(obj)相当于调用了这个obj的__len__方法
    # __len__方法return的值就是len函数的返回值
    # 如果一个obj对象没有__len__方法,那么len函数会报错

    # iter和next的例子
    # __iter__ iter(obj)
    # __next__ next
    # def iter(obj):
    # return obj.__iter__()
    # l = [1,2,3]
    # iter(l) # l.__iter__()

    # 练习
    # 类
    # self.s = ''
    # len(obj) = str的长度
    # class My:
    # def __init__(self,s):
    # self.s = s
    # def __len__(self):
    # return len(self.s)
    # my = My('abc')
    # print(len(my))

    # __new__ # ==> 构造方法
    # __init__ # ==> 初始化方法

    # class Single:
    # def __new__(cls, *args, **kwargs):
    # # print('在new方法里')
    # obj = object.__new__(cls)
    # print('在new方法里',obj)
    # return obj

    # def __init__(self):
    # print('在init方法里',self)

    # 1.开辟一个空间,属于对象的
    # 2.把对象的空间传给self,执行init
    # 3.将这个对象的空间返回给调用者
    # obj = Single()
    # single的new,single没有,只能调用object的new方法
    # new方法在什么时候执行???
    # 在实例化之后,__init__之前先执行new来创建一块空间

    # 单例
    # 如果一个类 从头到尾只能有一个实例,说明从头到尾之开辟了一块儿属于对象的空间,那么这个类就是一个单例类
    # class A:pass
    # a = A()
    # a2 = A()
    # a3 = A()
    # print(a,a2,a3)

    # 单例类
    # class Single:
    # __ISINCTANCE = None
    # def __new__(cls, *args, **kwargs):
    # if not cls.__ISINCTANCE:
    # cls.__ISINCTANCE = object.__new__(cls)
    # return cls.__ISINCTANCE
    # def __init__(self,name,age):
    # self.name = name
    # self.age = age
    #
    # s1 = Single('alex',83)
    # s2 = Single('taibai',40)
    # print(s1.name)
    # print(s2.name)
    # print(s1,s2)

    # __str__
    # l = [1,2,3] # 实例化一个list的对象
    # # l是个对象
    # print(l)

    # class Student:
    # def __str__(self):
    # return '%s %s %s'%(self.school,self.cls,self.name)
    #
    # def __init__(self,name,stu_cls):
    # self.school = 'oldboy'
    # self.name = name
    # self.cls = stu_cls
    #
    # he = Student('hezewei','py14')
    # # print(he)
    # huang = Student('huangdongyang','py14')
    # # print(huang)
    # # print(str(he)) # 内置的数据类型,内置的类,相当于执行__str__
    # print('学生1 : %s'%he)

    # print一个对象相当于调用一个对象的__str__方法
    # str(obj),相当于执行obj.__str__方法
    # '%s'%obj,相当于执行obj.__str__方法










  • 相关阅读:
    北京联通光猫WO-36(HG220GS-U)改为桥接模式
    使用DataGrip导入数据
    Spring知识点
    mybatis-generator
    项目中mybatis连接mysql常见问题
    Spring AOP
    Volatile
    Redis知识点
    Spring IOC
    Observer模式
  • 原文地址:https://www.cnblogs.com/kcwxx/p/9392475.html
Copyright © 2011-2022 走看看