特殊方法

# 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

 

posted @ 2018-07-05 09:35  小小猎魔人  阅读(181)  评论(0编辑  收藏  举报