• python 对象


    1.初识

    1.面向过程编程vs函数式编程vs面向对象编程

    s1 = 'fdskljfsda'
    count = 1
    for i in s1:
    	count += 1
    	
    l1 = [1,2,3,4,5]
    count = 1
    for i in l1:
    	count += 1
    	
    
    def my_len(a):
    	count = 1
    		for i in a:
        count += 1
    提高代码的可读性,减少了代码的重复性....
    上面统称为面向过程式编程.
    
    
    面向过程式编程:
    好处: 出色的完成你之前布置的所有的需求.
    坏处: 但凡更改或者增加一条需求,可能整个项目都随之改变.
    

    2.面向对象的结构

    # 1. 类是相似功能的集合体.
    
    
    # 2. 类 你要站在上帝的角度去考虑问题.
    
    
    # 类: 具有相似功能和特性的一类事物.
    # 对象:类的具体体现.
    
    # 一定要有宏观的概念,区分类与对象.
    
    # 类的第二个优点: 你要站在上帝的角度去考虑,类一个公共模板,对象是从这个公共的模板产出的.
    
    
    # 结构上分析:
    
    
    class Student:
    
    
        daily = '学习'
        examination = '考试'
    
    
        def work(self):
            print('每天要上课')
    
        def homework(self):
            print('家庭作业')
    
    
    
    # Human 类名要具有描述性,类名首字母大写,类名不宜用_
    
    

    3.从类名的角度使用类

    # class Student:
    #     """
    #     此类是构建学生类
    #     """
    #
    #     daily = '学习'
    #     examination = '考试'
    #
    #
    #     def work(self):
    #         print('每天要上课')
    #
    #     def homework(self):
    #         print('家庭作业')
    
    
    # 类名的角度调用类中的属性.
    
    # 1. 查看类中的所有的内容.  类名.__dict__只用于获取类中的全部.
    # print(Student.__dict__)
    # print(Student.__dict__['daily'])
    
    
    # 2. 万能的 .点.
    # print(Student.daily)  # 查
    # Student.cloth = '校服'  # 增
    # print(Student.__dict__)
    # Student.examination = '不考试!'  # 改
    # print(Student.examination)
    # del Student.daily  # 删
    # print(Student.__dict__)
    
    # 一般类中的属性都是通过类名.的方式去操控的.
    
    
    # 类名的角度调用类中的方法.(一般类中的方法(除去类方法,静态方法外)不通过类名调用)
    # Student.work(5565)  # 工作中不用类名调用
    

    4.实例化一个对象

    实例化对象发生了三件事

    # 1. 在内存中创建一个对象空间.
    # 2. 自动执行__init__方法,并且将对象空间传给self参数.
    # 3. 执行__init__方法里面的代码,给对象空间封装其属性.
    

    对象调用对象的属性

    # obj = Student()
    # print(obj)
    # 对象查看全部属性
    # print(obj.__dict__)
    
    # 对象可以操作对象空间的属性  万能的点
    # obj = Student()
    # # obj.age = '29'  # 增
    # # del obj.n  # 删
    # # obj.sex = '女'# 改
    # print(obj.n)  # 查
    # print(obj.__dict__)
    

    对象调用类中的属性

    # 对象查看类中的属性.
    # mc_sq = Student('骚强',18,'高端会所')
    # # print(mc_sq.daily)
    # mc_sq.daily = '骚麦'
    # print(mc_sq.daily)
    # print(mc_sq.__dict__)
    
    
    
    

    对象调用类中的方法

    # 对象调用类中的方法
    liye = Student('小黑',21,'洗头')
    # print(liye.__dict__)
    # liye.work()
    liye.work('绿油油')
    print(liye.__dict__)
    
    
    
    1. 什么是self?

      # self 就是类中方法的第一个位置参数,
      #  如果通过对象执行此方法,解释器就自动的将此对象空间当做实参传给self.
      # 约定俗称: 类中的方法第一个参数一般都设置成self.
      

    2.从空间角度研究类

    1.对象操作对象属性

    2.类名操作属性

    3.类对象指针

    4.对象取值顺序

    5.类名取值顺序

    class A:
    
        address = '美丽富饶的沙河'
    
        def __init__(self, name):
            self.name = name
    
        def func(self):
            if self.name == 'dsb':
                self.skins = '吉利服'
    
        def func1(self):
            print(self.__dict__)
            A.aaa = '易水寒'
    
    
    # obj = A('dsb')
    # # 类外面可以给对象封装属性
    # # respons = input('太白帅不帅!')
    # # if respons == '帅':
    # #     obj.weapon = 'AWM'
    # # print(obj.__dict__)
    #
    # # 类内部封装属性
    # obj.func()
    # print(obj.__dict__)
    
    # A.teamp = '39.5'
    # print(A.__dict__)
    # obj = A('dsb')
    # # A.func1(111)
    # A.func1(obj)
    # print(A.__dict__)
    
    
    
    
    class Person:
    
        mind = '有思想'
        language = '会使用语言'
    
        def __init__(self, name, age):
    
            self.name = name
            self.age = age
    
        def work(self):
            print('人类一般都需要工作')
    
    p1 = Person('dsb', 21)
    del p1.mind  # 报错
    # print(p1.mind)
    # p1.mind = '无脑'
    # print(p1.mind)
    # print(Person.mind)
    
    # 对象如果查询一个属性: 对象空间  ----> 类空间 ----> 父类空间  --->
    # 类查询一个属性: 类空间  ----> 父类空间  ---->
    # 单向不可逆
    
    # 对象与对象之间原则上互相独立(除去组合这种特殊的关系之外).
    

    3.类与类的关系

    1.依赖关系: 将一个类名或者类的对象传给另一个类的方法中.

    class A:
        pass
    
    class B:
        pass
    
    # 1.依赖关系(主从关系)
    
    # 大象进冰箱
    
    class Elephant:
    
    
        def __init__(self, name):
            self.name = name
    
        def open(self, ref1):
            # print(ref1)
            print(f'{self.name}默念三声: 芝麻开门')
            ref1.open_door()
    
        def close(self):
            print('大象默念三声:芝麻关门')
    
    class Refrigerator:
    
    
        def __init__(self, name):
            self.name = name
    
        def open_door(self):
            print(f'{self.name}冰箱门被打开了....')
    
        def close_door(self):
            print('冰箱门被关上了....')
    
    
    # ele = Elephant('琪琪')
    # ele1 = Elephant('安安')
    # ref = Refrigerator('美菱')
    # ele.open(ref)
    # ele1.open(ref)
    # 依赖关系: 将一个类的类名或者对象传给另一个类的方法中.
    
    # 实现两个:
    # 大象执行open方法:
    # 显示: '哪个大象  大象默念三声: 芝麻开门'
    # 显示: '哪个冰箱门 冰箱门被打开了....'
    
    # 关门的流程也需要完成.
    

    2.组合关系(关联组合聚合)

    # 组合:(聚合,组合,关联)
    
    # class Boy:
    #
    #     def __init__(self, name):
    #         self.name = name
    #
    #     def meet(self, girl_friend=None):
    #
    #         self.girl_friend = girl_friend  # wu对象空间 : girl_friend : object对象
    #
    #     def have_diner(self):  # self = wu这个对象空间
    #
    #         if self.girl_friend:
    #             print(f'{self.name}请年龄为:{self.girl_friend.age},姓名为{self.girl_friend.name}一起吃六块钱的麻辣烫')
    #             self.girl_friend.shopping(self)  # (self = wu对象空间)
    #         else:
    #             print('单身狗,吃什么吃')
    #
    #
    #
    # class Girl:
    #
    #     def __init__(self, name, age):
    #         self.name = name
    #         self.age = age
    #
    #     def shopping(self,boy_friend):
    #         print(f'{boy_friend.name},{self.name}一起去购物!')
    #
    # wu = Boy('吴超')
    # # wu.have_diner()
    # # flower = Girl('如花', 48)
    # # wu.meet('如花')
    # flower = Girl('如花', 48)
    # # 组合: 将一个类的对象封装成另一个类的对象的属性.
    # wu.meet(flower)
    #
    # wu.have_diner()
    

    3.继承关系

    什么是继承

    专业角度: B 继承 A类, B就叫做A的子类,派生类, A叫做B的父类,基类,超类. B类以及B类的对象使用A类的所有的属性以及方法.

    字面意思: 继承就是继承父母所有的资产.

    继承的优点.

    1. 节省代码.
    2. 增强的耦合性.
    3. 代码规范化.

    1.单继承

    # class Animal:
    #     def __init__(self, name, age, sex):
    #         self.name = name
    #         self.age = age
    #         self.sex = sex
    #
    # class Person(Animal):
    #     pass
    #
    # class Dog(Animal):
    #     pass
    #
    # class Cat(Animal):
    #     pass
    
    # Person  Dog  Cat : 子类,派生类
    # Animal: 父类, 基类, 超类
    

    1.从类名执行父类的属性.print(Person.__dict__) print(Person.live) Person.eat(55)

    2.从对象执行父类的一切.实例化对象一定一定会执行三件事. 一定会执行__init__

    注意: 子类以及子类对象只能调用父类的属性以及方法,不能操作(增删改).

    子类重写父类的方法:子类会将父类的方法覆盖了

    对象查找顺序先从对象空间找名字, 子类找名字, 父类找名字.

    # class Animal:
    #
    #     live = '有生命的'
    #
    #     def __init__(self, name, age, sex):
    #         self.name = name
    #         self.age = age
    #         self.sex = sex
    #
    #     def eat(self):
    #         print(f'self----> {self}')
    #         print('动物都需要进食')
    #
    #
    # class Person(Animal):
    #
    #     def __init__(self,name, age, sex, hobby):
    #         # 方法一:
    #         Animal.__init__(self, name, age, sex)
    #         # 方法二:
    #         # super(Person, self).__init__(name, age, sex)
    #         # super().__init__(name, age, sex)
    #         self.hobby = hobby
    #
    #     def eat(self):
    #         print('人类需要进食')
    #         super().eat()
    #
    #
    # p1 = Person('怼怼哥', 23, '不详','吹牛逼')
    # # print(p1.__dict__)
    # p1.eat()
    

    2.多继承

    面向对象:

    python2.2之前:都是经典类,

    python2.2直至python2.7之间存在两种类型: 经典类,新式类.

    经典类: 基类不继承object,查询规则 依靠:深度优先的原则.

    新式类: 基类必须继承object,查询规则: mro算法.(A.mro())

    # mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )
    # mro(Foo(H,G)) = [Foo] + merge(mro(H), mro(G),[H,G])
    
    # 表头:
    #   列表的第一个元素
    #
    # 表尾:
    #   列表中表头以外的元素集合(可以为空)
    # 表头,表尾
    # [A,B,C] : 表头: A 表尾: [B,C]
    # [A] : 表头: A 表尾: []
    
    '''
    class O:
        pass
    
    class D(O):
        pass
    
    class E(O):
        pass
    
    class F(O):
        pass
    
    class B(D,E):
        pass
    
    class C(E,F):
        pass
    
    class A(B,C):
        pass
    
    # a = A()
    # a.func()
    '''
    '''
    mro(A) = mro(A(B,C))
           = [A] + merge(mro(B), mro(C), [B,C])
    
    mro(B) = mro(B(D,E))
           = [B] + merge(mro(D), mro(E), [D,E])
           = [B] + merge([D,O], [E,O], [D,E])
           = [B,D] + merge([O], [E,O], [E])
           = [B,D,E,O]
           
    mro(C) = mro(C(E,F))
           = [C] + merge(mro(E), mro(F),[E,F])
           = [C] + merge([E,O],[F,O],[E,F])
           = [C,E] + merge([O],[F,O],[F])
           = [C,E,F,O]
    
    mro(A) = mro(A(B,C))
           = [A] + merge([B,D,E,O], [C,E,F,O], [B,C])
           = [A,B] + merge([D,E,O], [C,E,F,O], [C])
           = [A,B,D] + merge([E,O], [C,E,F,O], [C])
           = [A,B,D,C] + merge([E,O], [E,F,O])
           = [A,B,D,C,E] + merge([O], [F,O])
           = [A,B,D,C,E,F,O]
    

    python3x 只有新式类.

    面向对象三大特性: 继承封装多态.

    封装:

    ​ 将一些东西内容封装到一个地方,你还可以取出来.

    ​ 类设置静态属性, 设置一些方法,

    ​ 对象.对象可以在其对象空间中封装一些属性.

    多态:

        一个事物产生多种形态. 水: 气态液态固态.
    

    ​ python中 默认支持多态.

    ​ python中 定义变量不用规定变量的类型.

    鸭子类型:

    ​ python中: 你看起来像鸭子,那么你就是鸭子.

    A,B两个类,没有任何关系,独立两个,但是里面的功能相似,所以python一般会将类似于A,B两个类
    里面的相似的功能让其命名相同.
    1. A,B虽然无关系,但是很默契的制定了一个规范.让你使用起来更方便.
    

    类的约束.

     类的约束有两种解决方式:
    # 1. 在父类建立一种约束.
    # 2. 模拟抽象类(指定一种规范)的概念,建立一种约束.
    
    
    # 第一种解决方式:
    #
    # class Payment:
    #
    #     def pay(self,money):  # 约定俗称定义一种规范,子类要定义pay方法.
    #         raise Exception('子类必须定义此方法')
    #
    #
    # class QQpay(Payment):
    #
    #     def pay(self, money):
    #         print(f'利用qq支付了{money}')
    #
    #
    # class Alipay(Payment):
    #
    #     def pay(self, money):
    #         print(f'利用支付宝支付了{money}')
    #
    # # class Wechatpay(Payment):
    # #     def pay(self,money):
    # #         print(f'利用微信支付了{money}')
    #
    # class Wechatpay(Payment):
    #     def fuqian(self,money):
    #         print(f'利用微信支付了{money}')
    #
    # # 支付功能 规划一下
    #
    # def pay(obj,money,choice):  # 归一化设计
    
    #     obj.pay(money)
    #
    # choice = input('qq,weixin,zhifubao')
    # obj3 = Wechatpay()
    # pay(obj3,300)
    # obj3.fuqian(300)
    # # print(11)
    
    # raise TypeError('代码格式错误')
    # print(222)
    
    # 第一种约束: 在父类定义一个pay方法,主动抛出异常,如果子类没有定义pay方法,并且沿用了父类的pay方法
    # 即会报错.   python推荐的一种约束方式.
    
    
    # 第二种:
    # from abc import ABCMeta,abstractmethod
    #
    # class Payment(metaclass=ABCMeta):
    #             # 抽象类 接口类  规范和约束  metaclass指定的是一个元类
    #     @abstractmethod
    #     def pay(self, money):
    #         pass  # 抽象方法
    #
    #
    # class QQpay(Payment):
    #
    #     def pay(self, money):
    #         print(f'利用qq支付了{money}')
    #
    #
    # class Alipay(Payment):
    #
    #     def pay(self, money):
    #         print(f'利用支付宝支付了{money}')
    #
    # # class Wechatpay(Payment):
    # #     def pay(self,money):
    # #         print(f'利用微信支付了{money}')
    #
    # class Wechatpay(Payment):
    #     def fuqian(self,money):
    #         print(f'利用微信支付了{money}')
    #
    #     # def pay(self,money):
    #     #     pass
    #
    #
    # obj3 = Wechatpay()
    
    # 利用抽象类的概念: 基类如上设置,子类如果没有定义pay方法,在实例化对象时就会报错.
    

    super的深入理解.

    class A:
        def f1(self):
            print('in A')
    
    class Foo(A):
    
        def f1(self):
            super().f1()
            print('in Foo')
    
    class Bar(A):
    
        def f1(self):  # self = obj
            print('in Bar')
    
    class Info(Foo,Bar):
    
        def f1(self):  # self = obj
            super(Foo,self).f1()
            print('in Info f1')
    
    obj = Info()  # [Info, Foo, Bar, A]
    obj.f1()
    
    # super() 严格意义并不是执行父类的方法.
    # 单继承: super() 肯定是执行父类的方法.
    # 多继承: super(S,self) 严格按照self从属于的类的mro的执行顺序,执行 S类的下一位.
    

    类的私有属性

    类中的私有成员: 私有类的静态属性, 私有对象属性,私有方法

    类的公有静态属性

    1. 对于类的公有静态属性,类的外部,类的内部,派生类都可以访问.
    # class B:
    #     school_name = '老男孩教育'
    #
    #
    # class A(B):
    #
    #     class_name = 'python23'
    #
    #     def func(self):
    #         print(self.class_name)
    #
    # obj = A()
    # print(obj.class_name)
    # obj.func()
    # print(obj.school_name)
    

    类的私有静态属性

    # class B:
    #     school_name = '老男孩教育'
    #     __consc_edu = '良心教育'
    #
    # class A(B):
    #
    #     class_name = 'python23'
    #     __girlnum = '1个'
    #
    #     def func(self):
    #         # print(self.class_name)
    #         # print(self.__girlnum)
    #         print(self.__consc_edu)
    # obj = A()
    # 私有静态属性: 类外部不能访问
    # print(obj.__girlnum)
    # print(A.__girlnum)
    # 私有静态属性: 类内部可以访问
    # obj.func()  # 派生类不可访问
    

    对象的私有属性

    # 2. 对象的私有属性
    
    # class B:
    #     school_name = '老男孩教育'
    #     __consc_edu = '良心教育'
    #
    #     def __init__(self, weight):
    #         self.__weight = weight
    # class A(B):
    #
    #     def __init__(self, name, age, weight):
    #         super().__init__(weight)
    #         self.name = name
    #         self.__age = age
    #
    #     def func(self):
    #         # print(self.__age)  # 类的内部可以使用
    #         print(self.__weight)  # 派生类中也不可访问
    
    
    # obj = A('马倩',18, 180)
    # # print(obj.__age)  # 类的外部不能访问
    # obj.func()
    
    # 如果想设定一些私有的或者是不想让类外面用到,密码,加密方式,等设置成私有成员.
    
    # 拓展: 私有成员除了在类内部,当真访问不到么?
    
    #
    # class A:
    #     __girlnum = '1个'
    #
    
    # print(A.__dict__)
    
    # python中所有的私有成员: 就是在私有成员前面加上 _类名而已.
    # print(A._A__girlnum)  # 千万不要这么去访问!!!
    

    类方法

    class A:
    
        num = 1
    
    
        def func(self):
            print('实例方法')
    
        @classmethod  # 类方法: 由类名直接调用的方法,他会自动的将类名传给cls
        def a_func(cls):
            # print(f'cls---> {cls}')
            # print(cls.num)
            # o = cls()
            # print(o)
            # print('这是类方法')
            print(cls)
    # obj = A()
    # obj.func()
    # A.func(obj)
    # print(A)
    # A.a_func()
    # obj.a_func()  # 对象也可以调用类方法,但是会自动将其从属于的类名传给cls
    
    
    

    静态方法

     不依赖于类,也不依赖于对象,他就是一个普通的函数放置于类中是结构更加清晰与合理.
    # class A:
    #
    #
    #     def func(self):
    #         print(111)
    
    #     @staticmethod
    #     def static_func(a,b,c):
    #         print(f'{a}{b}{c}静态方法')
    #
    #
    # def static_func(a,b,c):
    #     print(f'{a}{b}{c}静态方法')
    #
    # # A.static_func()
    # obj = A()
    # obj.static_func(1,2,3)
    

    伪装属性

    伪装成属性,虽然在代码级别没有提升,但是看起来更合理.

    class Foo:
    
        def __init__(self,name):
            self.name = name
        @property#后面两种方法都必须基于这个
        def aaa(self):
            print('get的时候运行我啊')
    
        @aaa.setter
        def aaa(self,v):
            print('修改的时候执行我')
    
        @aaa.deleter
        def aaa(self):
            print('删除的时候执行我')
    obj = Foo('alex')
    # print(obj.name)
    # obj.name = 'dsb'
    # del obj.name
    # print(obj.name)
    # obj.aaa
    # obj.aaa = '太白'
    # print(Foo.aaa)
    # del obj.aaa
    
    # 设置属性的另外一种写法:
    
    
    # class Foo:
    #
    #     def get_AAA(self):
    #         print('get的时候运行我啊')
    #
    #     def set_AAA(self,value):
    #         print('set的时候运行我啊')
    #
    #     def delete_AAA(self):
    #         print('delete的时候运行我啊')
    #
    #
    #     bbb = property(get_AAA,set_AAA,delete_AAA) #内置property三个参数与get,set,delete一一对应
    #
    # f1=Foo()
    # f1.bbb
    # f1.bbb='aaa'
    # del f1.bbb
    

    对象之间的关系

    isinstance(基类或派生的实例化)

    # 对象与类之间的关系
    # isinstance(obj,N): 判断 obj对象 是由N类(N的派生类)实例化的对象 返回 True.
    # print(isinstance(obj, A))
    
    

    issubclass(子孙)

    # issubclass(M,N) 判断是M类是N类的子孙.
    # print(issubclass(C, B))
    # print(issubclass(C, A))
    

    type(判断属于哪个类)

    from collections import Iterable
    from collections import Iterator
    
    # s1 = 'seewfsdkfl'  # class str(Iterable)   Iterable
    # l1 = [1, 2, 3]
    
    # print(type(s1)) # 判断的是对象从属于哪个类
    # print(type(l1))
    
    # print("__iter__" in dir(s1))
    # print(isinstance(s1, Iterable))
    #判断是否是可迭代对象
    
    
    # type 到底是什么?
    # type 元类 python中一切皆对象 , 一个类也是一个对象.
    # 么这个(类)对象肯定是由类实例化出来的.
    # python中你创建的所有类,以及大部分list str等等这些类,都是从type元类实例化得来的.
    
    ## python中继承object类都是新式类.
    # object 也是由type元类实例化得来的.
    

    异常处理(try)

    单分支

    # 单分支
    
    # try:
    #     l1 = [1,2,3]
    #     print(l1[100])
    #
    #     dic = {1: 2,'a': 'b'}
    #     print(dic[3])
    #
    #     num = input('请输入序号')
    #     int(num)
    #
    # except IndexError as e:
    #     # print('处理了索引错误')
    #     print(e)
    #
    # print(111)
    # print(222)
    

    多分支

    普通多分支

    # try:
    #     # l1 = [1,2,3]
    #     # print(l1[100])
    #     #
    #     # dic = {1: 2,'a': 'b'}
    #     # print(dic[3])
    #
    #     num = input('请输入序号')
    #     int(num)
    #
    # except IndexError as e:
    #     print('处理了索引错误')
    # except KeyError as e:
    #     print('没有此键')
    # except ValueError as e:
    #     print('出现了转化错误')
    #
    # print(111)
    # print(222)
    
    # 及时解决异常,避免程序中断.
    
    
    

    程序的分流

    # 程序的分流.
    
    dic = {
        1: 111,
        2: 333,
        3: 555,
    }
    
    
    # while 1:
    #     try:
    #         num = input('请输入序号')
    #         int(num)
    #         print(dic[int(num)])
    #
    #     except KeyError as e:
    #         print('选项超出范围,请重新输入')
    #     except ValueError as e:
    #         print('请输入数字')
    
    # print(111)
    # print(222)
    
    

    万能异常

    # 万能异常
    
    # try:
    #     num = input('请输入序号')
    #     int(num)
    #     print(dic[int(num)])
    #
    # except Exception as e:
    #     print(e)
    # print(111)
    
    # 什么时候用万能异常,什么时候用多分支?
    #如果你只是想把这个异常处理掉,让程序继续执行. 万能异常.
    # 如果出现了异常,你是想根据不同的异常执行不同的逻辑流程,你要采取多分支.
    

    万能异常加多分支

    
    # dic = {
    #     1: 111,
    #     2: 333,
    #     3: 555,
    # }
    #
    #
    # while 1:
    #     try:
    #         num = input('请输入序号')
    #         int(num)
    #         print(dic[int(num)])
    #
    #     except KeyError as e:
    #         print('选项超出范围,请重新输入')
    #     except ValueError as e:
    #         print('请输入数字')
    #     except Exception:
    #         pass
    

    其他处理(finally)

    # 异常处理其他成员
    
    # try:
    #     num = input('请输入序号')
    #     int(num)
    #     print(dic[int(num)])
    #
    # except KeyError as e:
    #
    #     print('选项超出范围,请重新输入')
    # except Exception:
    #     pass
    # # else:  # 如果上面无异常执行else语句,否则不执行else语句.
    # #     print(666)
    #
    # finally: # 在整个程序终止之前,执行finally
    #     print('执行finally')
    #证明方法
    try:
        s1 = 'a'
        s2 = int(s1)
    finally:
        exit()#会在报错之前终止程序
    

    函数与方法

    # len()
    # print()
    # zip()
    
    # str.count()
    # str.split()
    #
    # def func():
    #     pass
    #
    #
    # class A:
    #
    #     def func(self):
    #         pass
    
    # 1 通过函数名可以大致判断
    # print(func)  # <function func at 0x00000000005D1EA0>
    # obj = A()
    # print(obj.func)  # <bound method A.func of <__main__.A object at 0x0000000001DE1CF8>>
    
    # 2. 通过types模块去验证
    from types import FunctionType
    from types import MethodType
    
    
    def func():
        pass
    
    
    class A:
    
        def func(self):
            pass
    
        @staticmethod
        def f():
            pass
    # print(isinstance(func, FunctionType))
    # print(isinstance(func, MethodType))
    
    # 类名调用func 就是一个函数
    # print(isinstance(A.func, FunctionType))
    # print(isinstance(A.func, MethodType))
    # obj = A()
    # 对象调用func 就是一个方法
    # print(isinstance(obj.func, FunctionType))
    # print(isinstance(obj.func, MethodType))
    
    # 对于静态方法的研究
    # print(isinstance(A.f, FunctionType))
    # print(isinstance(A.f, MethodType))
    
    # obj = A()
    # # 对象调用func
    # print(isinstance(obj.f, FunctionType))
    # print(isinstance(obj.f, MethodType))
    
    # 函数与方法
    # 函数: 全都是显性传参
    # 方法: 存在隐性传参
    

    反射

    # 从实例的角度去研究反射
    # class A:
    #
    #     static_field = '静态属性'
    #
    #     def __init__(self, name, age):
    #         self.name = name
    #         self.age = age
    #
    #     def func(self):
    #         print('in A func')
    #
    #
    # obj = A('MC骚Q', 18)
    # print(obj.name)
    # #
    # print(hasattr(obj,'name'))  # ***
    # print(getattr(obj,'name1',None))  ***
    # setattr(obj,'hobby', '玩') *
    # print(getattr(obj,'hobby'))
    # print(obj.hobby)
    # delattr(obj,'name') *
    # print(hasattr(obj,'name'))
    # if hasattr(obj, 'static_field'):
    #     print(getattr(obj,'static_field'))
    #
    # if hasattr(obj, 'func'):
    #     # print(getattr(obj,'func'))
    #     getattr(obj,'func')()
    
    
    # 从类的角度研究反射
    #
    # class A:
    #
    #     static_field = '静态属性'
    #
    #     def __init__(self, name, age):
    #         self.name = name
    #         self.age = age
    #
    #     def func(self):
    #         print(self)
    #         print(self.name)
    #         print('in A func')
    #
    # print(hasattr(A,'static_field'))
    # print(getattr(A,'static_field'))
    
    # obj = A('大表哥', 18)
    # # print(getattr(A, 'func'))
    # getattr(A,'func')(obj)
    
    
    # 从当前脚本研究反射
    # def func1():
    #     print('in func1')
    #
    # def func2():
    #     print('in func2')
    
    # def func3():
    #     print('in func3')
    
    # l1 = [func1, func2, func3]
    # l1 = [f'func{i}' for i in range(1,4)]
    
    # class B:
    #     static = 'B类'
    
    
    
    import sys
    # print(sys.modules)
    this_modules = sys.modules[__name__]  # 获取当前脚本这个对象
    # print(this_modules)
    # print(getattr(this_modules,'func1'))
    # getattr(this_modules,'func1')()
    # cls = getattr(this_modules,'B')
    # obj = cls()
    # print(obj.static)
    # l1 = [f'func{i}' for i in range(1,4)]
    # for i in l1:
    #     getattr(this_modules, i)()
    
    #
    # def func1():
    #     print('in func1')
    #
    # func1()
    #
    # def func2():
    #     print('in func2')
    
    # 在其他模块研究反射
    # import other_modules as om
    # # om.test()
    # getattr(om, 'test')()
    
    
    # class Auth:
    #
    #     function_list = [('login','请登录'), ('register','请注册'), ('exit', '退出')]
    #
    #     def login(self):
    #         print('登录函数')
    #
    #
    #     def register(self):
    #         print('注册函数')
    #
    #
    #     def exit(self):
    #         print('退出...')
    #
    #
    # while 1:
    #     obj = Auth()
    #     for num,option in enumerate(obj.function_list,1):
    #         print(num,option[1])
    #     choice_num = input('请输入选择:').strip()
    #     if hasattr(obj,func_name):
    #         getattr(obj,func_name)()
    
    

    双下方法

    # class A:
    #
    #     def __init__(self,name,age,hobby):
    #
    #         self.name = name
    #         self.age = age
    #         self.hobby = hobby
    #         # print(111)
    #
    #     def __len__(self):
    #         # print('触发__len__方法')
    #         return len(self.__dict__)
    # obj = A('MC骚亚伟')
    
    # __len__
    # obj = A('MC骚亚伟',18, '抽烟')  #
    # ret = len(obj)
    # print(ret)
    # 一个对象之所以可以使用len()函数,根本原因是这个对象从输入的类中有__len__方法,
    # print(ret)
    # len('srtfdsf')
    # str
    
    
    # __hash__
    
    # class A:
    #
    #     pass
    
    # hash(obj) 会调用obj这个对象的类(基类)的__hash__方法
    # obj = A()
    # print(hash(obj))
    # object
    
    # __str__  __repr__ ***
    
    
    # class Student:
    #
    #     def __init__(self,name,age,sex):
    #         self.name = name
    #         self.age = age
    #         self.sex = sex
    #     #
    #
    #     def __repr__(self):
    #         return f'姓名:{self.name}年龄:{self.age}性别:{self.sex}'
    #
    #     def __str__(self):
    #         return f'姓名:{self.name}年龄:{self.age}性别:{self.sex}666'
    #
    # obj = Student('小智', 18, '男')
    # obj1 = Student('dj智', 18, '男')
    # obj2 = Student('mc智', 18, '男')
    #
    # # print(str(obj))
    # # print(str(obj))  # 会触发__str__
    # # print(obj)  # 打印输出实例会触发__str__
    # # print(obj1)
    # # print(obj2)
    # # print('此对象为%s' %obj)  # 格式化输出会触发__str__
    # # print(obj)  # 触发__repr__
    # print('此对象是%r' %obj)  # 触发__repr__
    #
    # # print(obj) 先触发__str__方法
    
    
    # __call__方法
    # class A:
    #     def __init__(self):
    #         self.a = 1
    #         print(111)
    #
    #     def __call__(self, *args, **kwargs):
    #         print(666)
    #
    # obj = A()
    # obj()
    
    
    # class A:
    #     def __init__(self):
    #         self.a = 1
    #         self.b = 2
    #
    #     def __eq__(self,obj):
    #         print(111)
    #         return True
    #         # if  self.a == obj.a and self.b == obj.b:
    #         #     return True
    # a = A()
    # b = A()
    # print(a == b)  # 对一个类的两个对象进行比较操作,就会触发__eq__方法
    
    # __del__ 析构方法
    # class A:
    #
    #     def __del__(self):
    #         print(111)
    #
    # obj = A()
    # del obj
    #  l1 = [1,2,3]
    # dic = {1:2}
    # del l1
    # del dic  # 主动删除
    # # print(dic)
    # print(111)
    # print(222)
    
    # __new__ 构造方法
    # __new__创造并返回一个新对象.
    
    
    # class A(object):
    #
    #     def __init__(self):
    #         print('in __init__')
    #
    #     def __new__(cls, *args, **kwargs):
    #         # print(cls)  # A
    #         print('in __new__')
    #         object1 = object.__new__(cls)
    #         return object1
    # obj = A()
    # 类名() 先触发__new__ 并且将类名自动传给cls.
    # print(obj)
    
    # 单例模式
    
    # 一个类只能实例化一个对象,无论你实例化多少次,内存中都只有一个对象.
    # class A:
    #     pass
    # obj = A()
    # obj1 = A()
    # obj2 = A()
    # print(obj,obj1,obj2)
    
    # 面试几乎都会让你手写一个单例模式
    
    # 这个类的对象不是个性化的,主要是实例化对象之后去执行类中的方法.
    # class A:
    #     __instance = None
    #
    #     def __new__(cls, *args, **kwargs):
    #         if not cls.__instance:
    #             object1 = object.__new__(cls)
    #             cls.__instance = object1
    #         return cls.__instance
    #
    #
    # obj = A()
    # obj1 = A()
    # obj2 = A()
    # print(obj,obj1,obj2)
    
    # __item__
    
    # 对对象进行类似于字典的操作
    #
    # class Foo:
    #     def __init__(self, name):
    #         self.name = name
    #
    #     def __getitem__(self, item):
    #         print(item)
    #         print('get时 执行我')
    #
    #     def __setitem__(self, key, value):
    #         self.name = value
    #         print('set时执行我')
    #
    #     def __delitem__(self, key):
    #         print(f'del obj{[key]}时,我执行')
    #
    # obj = Foo('御姐')
    # # obj.__dict__
    # # obj['name']
    # # obj['name'] = '萝莉'
    # # print(obj.name)
    # del obj['name']
    
    # __enter__ __exit__
    
    # class A:
    #     def __init__(self,name):
    #         self.name = name
    #
    #     def __enter__(self):
    #         print(111)
    #
    #     def __exit__(self, exc_type, exc_val, exc_tb):
    #         print(222)
    #
    # # obj = A('mc小龙')
    #
    # # 对一个对象类似于进行with语句上下文管理的操作, 必须要在类中定义__enter__ __exit__
    # with A('mc小龙') as obj:
    #     print(555)
    # # print(obj.name)
    
    
    # class A:
    #
    #     def __init__(self, text):
    #         self.text = text
    #
    #     def __enter__(self):  # 开启上下文管理器对象时触发此方法
    #         self.text = self.text + '您来啦'
    #         return self  # 将实例化的对象返回f1
    #
    #     def __exit__(self, exc_type, exc_val, exc_tb):  # 执行完上下文管理器对象f1时触发此方法
    #         self.text = self.text + '这就走啦'
    #
    # # f1 = A('大爷')
    # with A('大爷') as f1:
    #     print(f1.text)
    # print(f1.text)
    
  • 相关阅读:
    RocketMQ之二:分布式开放消息系统RocketMQ的原理与实践(消息的顺序问题、重复问题、可靠消息/事务消息)
    Redis 发布/订阅机制原理分析
    Guava 12-数学运算
    Guava] 11
    Guava 10-散列
    Guava 9-I/O
    Guava 8-区间
    mat(Eclipse Memory Analyzer tool)之二--heap dump分析
    Python流程控制语句
    监控和管理Cassandra
  • 原文地址:https://www.cnblogs.com/nieice/p/11252529.html
Copyright © 2020-2023  润新知