• 特殊方法


    # class F:
    #     pass
    # class A(F):
    #     pass
    # class B(A):
    #     pass
    # class C:
    #     pass
    # obj1 = B()
    # print(isinstance(obj1,B))
    # print(isinstance(obj1,A))
    # print(isinstance(obj1,F))
    # isinstance 这个对象是本类实例化的,或者是此类的派生类实例化出来的.
    # print(isinstance(obj1,C))
    
    # print(issubclass(C,B))
    # issubclass:判断一个类是否是另一个类的派生类.
    # print(issubclass(B,A))
    # print(issubclass(B,F))
    # __len__, __hash__ __str__ __repr__
    # print(dir(list))
    # print(dir(str))
    
    # l1 = list([1, 1, 2, 3])  # 是list类实例化的一个对象
    # print(len(l1))  # 对一个对象len(),则他会执行这个对象从属于的类 的__len__方法
    
    # class A:
    #     def __init__(self,name,age):
    #         self.name = name
    #         self.age = age
    #
    # a1 = A('oldboy',1000)
    # print(len(a1))
    
    # class A:
    #     def __init__(self,name,age):
    #         self.name = name
    #         self.age = age
    #
    #     def __len__(self):
    #         return len(self.__dict__)
    #
    # a1 = A('oldboy',1000)
    # print(len(a1))
    # 如果对一个对象进行len()操作,
    # 他会找到对象从属于的类中的__len__方法,并且此方法中必须要有数字的返回值.
    # __hash__
    
    # class A:
    #     def __init__(self,name,age):
    #         self.name = name
    #         self.age = age
    #
    #     # def __len__(self):
    #     #     return len(self.__dict__)
    #     def __hash__(self):
    #         return 100
    # a1 = A('oldboy',1000)
    # print(hash(a1))
    
    #  __str__    __repr__
    # class A:
    #     def __init__(self,name,age):
    #         self.name = name
    #         self.age = age
    #
    #     def __str__(self):
    #         return 'alex'
    # a1 = A('oldboy',1000)
    # # print(a1)  # <__main__.A object at 0x000000000237E908>
    # print(str(a1),type(str(a1)))  # '<__main__.A object at 0x000000000237E908>'
    # class A:
    #
    #     def __init__(self):
    #         pass
    #     def __str__(self):
    #         print(666)
    #         return '太白'
    # a = A()
    # print(a)  # 打印对象,就会触发类中__str__方法
    # str(a) # str(a),就会触发类中__str__方法
    # print('打印此类对象:%s' % a)  # 格式化输出 '%s'a
    
    
    # class A:
    #     def __init__(self):
    #         pass
    #     def __repr__(self):
    #         return '太白'
    # a = A()
    # print(repr(a))
    # print('%r'%a)
    
    # msg = '飞哥说他是%s,他真%r,%s,%s'  % ('sb','NB',666,6.66)
    # print(msg)
    # *** __call__
    # class A:
    #     def __init__(self):
    #         pass
    #     def func(self):
    #         print(111)
    #
    #     def __call__(self, *args, **kwargs):
    #         '''各种代码'''
    #         # print(666)
    #         print(args)
    #         return 'wusir'
    # a1 = A()
    # print(a1(1,2,3))  # 对象() 自动执行类中的__call__方法
    # __eq__
    # class A:
    #     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
    # a1 = A()
    # b1 = A()
    # print(a1 == b1)  # 对一个类实例化的两个对象进行比较运算的时候,他会自动触发类中的__eq__
    # python垃圾回收机制
    # :文件中你创建的所有的变量,类等等.执行完毕之后,
    # 一段时间内如果没有用到, 他会自动在内存中去除.
    # 深入研究: 他会将你的所有变量,类等等做个标记,在一段时间之内,没有被调用,则就会自动回收.
    
    
    # __del__  析构方法
    
    # class A:
    #     def __init__(self):
    #         pass
    #     def __del__(self):
    #         print(666)
    # a1 = A()
    # *** __new__ : object产生并返回一个对象空间.
    # 自己定义的__new__ 第一个参数自动接收类空间.
    
    # 执行顺序:先执行__new__方法,然后在执行__init__方法
    # class A:
    #     def __init__(self):
    #         self.x = 1
    #         print('in init function ')
    #
    #     def __new__(cls, *args, **kwargs):
    #         print(cls)  # <class '__main__.A'>
    #         print('in new function ')
    #         # return object.__new__(cls)  # 调用object类中的__new__方法,产生一个真正的对象空间
    #         return super().__new__(cls)  # 返回给 A()
    # object
    # a1 = A()
    # print(a1)
    # print(a1)
    # 类名() 自动执行类中__new__ 类中没有,则找到object
    # 找到__new__ 这个方法是产生一个对象空间,自动执行类中的__init__,给这对象空间封装一些属性,
    # 最后返回给A() 然后给 变量a1
    # print(a1.x)
    # class A1:
    #     def __new__(cls, *args, **kwargs):
    #         '产生对象空间'
    #         pass
    #
    # class B(A1):
    #     def __init__(self):
    #         self.x = 1
    #     def __new__(cls, *args, **kwargs):
    #         print('B1')
    # b1 = B()
    # print(b1)
    # 最详细版本:
    '''
    1,类名() 执行 __new__方法,先从自己的类中寻找,
    如果没有找到,则从父类(直到object类)寻找,然后从object的__new__产生一个对象空间,返回给类名().
    2,对象空间一旦产生并返回.则自动执行__init__方法,给这个对象空间封装属性.
    3,最终你得到是封装好属性的对象空间.
    
    '''
    # 设计模式: 单例模式. 最简单的设计模式. 面试必考,默写.
    # 单例模式: 对一个类是能实例化一个对象.
    # class A:
    #     pass
    # a1 = A()
    # b1 = A()
    # c1 = A()
    # d1 = A()
    # print(a1,b1)

    # class A:
    # __instance = None
    # def __new__(cls, *args, **kwargs):
    # if A.__instance is None: # 第一次进入,满足这个条件
    # obj = object.__new__(cls) # 利用object 创建一个对象空间 给了obj
    # A.__instance = obj # 我将类的私有静态字段 __instance 重新赋值了 对象空间obj
    # return A.__instance
    # a1 = A()
    # b1 = A()
    # c1 = A()
    # print(a1,b1,c1)
    # *** item
    class Foo:
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    def __getitem__(self, item):
        print(self.__dict__[item])
        if hasattr(self,item):
            return getattr(self,item)
        else:
            return '没有此属性'
        # return getattr(self, item, '没有此属性')
    
    # def __setitem__(self, key, value):
    #     print(key,value)
    #
    # def __delitem__(self, key):
    #     print(key)
    #
    # def __delattr__(self, item):
    #     print(item)
    #     print('del obj.key时,我执行')
    
    f1 = Foo('alex', 12, '')
    print(f1['name'])  # 对一个对象使用f1['name1']这种方法,自动触发__getitem__这个方法,将'oldboy123' 传到这个方法中.
    # print(f1['age1'])
    # f1['name1'] = 'wusir666'
    # del f1['fkjdslfjdslafj']
    #  如果你对对象进行相似的字典的操作,就会主动触发类中__getitem__ __setitem__ delitem__
    
    # del f1.name
    # del f1.aaaaaa
  • 相关阅读:
    项目踩坑实记 :2019年(SSM 架构)
    多线程实践
    SpringCloud(一)之我学 Eureka
    JVM 第一次学习总结 --- 2019年4月
    《深入理解 JVM 虚拟机》 --- 看书笔记
    JVM 学习(二)Java 内存模型、方法内联、逃逸 --- 2019年4月
    JVM 学习(一)反射、垃圾回收、异常处理--- 2019年4月
    剑指offer-18.树的子结构
    剑指offer-17.合并两个有序链表
    剑指offer-16.翻转链表
  • 原文地址:https://www.cnblogs.com/molieren/p/9266598.html
Copyright © 2020-2023  润新知