首页 > 编程语言 > 详细

python之魔法方法

时间:2019-10-04 11:26:30      阅读:58      评论:0      收藏:0      [点我收藏+]
is 和 == 的关系
‘‘‘
== 值相等    值运算
is 内存地址相等 身份运算
is 要求更苛刻
    不仅要求值相等,还要求内存地址相同
‘‘‘

a = 111
b = 111
a == b  # 值相等    值运算使用
a is b  # 值相等内存地址不相等使用

is 和 isinstance的关系
class A: pass
class B(A): pass
b = B()
print(isinstance(b, B))
print(isinstance(b, A))
print(issubclass(B, A))

class Mystr(str):pass
ms = Mystr(alex)
print(ms)
print(type(ms) is str)  # 不包含继承关系,只管一层
print(isinstance(alex, str)) # 包含所有的继承关系
__call__方法
class A:
    def __call__(self, *args, **kwargs):
        print(执行call方法)

class B:
    def __init__(self, cls):
        # 实例化A之前做xx事
        self.a = cls()
        self.a()
        # 实例化A之后做xx事
# A()()
# a()   # 和上面的结果一样,相当于调用__call__方法

B(A)
iter和next例子
# iter和next的例子
# __iter__ iter(obj)
# __next__ next
def iter(obj):
   return obj.__iter__()  # 返回迭代对象

li = [1,2,3]
print(iter(li))

__len__方法

class Mylist:
    def __init__(self):
        self.li = [1,2,3]
    def __len__(self):
        print(len)
        # return len(self.li)
        return len(self.__dict__)  # 有多少个属性

l = Mylist()
print(len(l))
# len(obj)相当于调用了这个对象的__len__方法
# __len__方法return的值就是len函数的返回值
# 如果一个obj对象没有__len__方法,那么len函数会报错


# 练习  写一个类 统计str的长度
# self.s = ‘‘  len(obj) = str的长度

class StrLen:
    def __init__(self,s):
        self.s = s

    def __len__(self):
        return len(self.s)

b = StrLen(adsgsdg)
print(len(b))
__new__   # 构造方法
__init__  # 初始化方法
class Single:
    def __new__(cls, *args, **kwargs):
        obj = object.__new__(cls)
        print(new, obj)
        return obj

    def __init__(self):
        print(init, self)

# 1、开辟一个空间,属于对象的
# 2、把对象的空间传给self,执行init
# 3、将这个对象的空间返回给调用者

单例类

# 单例类
class single:
    __ISINSTANCE = None
    def __new__(cls, *args, **kwargs):
        if not cls.__ISINSTANCE:
            cls.__ISINSTANCE = object.__new__(cls)
        return cls.__ISINSTANCE


    def __init__(self,name,age):
        self.name = name
        self.age = age

# 不论实例多少个对象结果都是同一个内存空间
a = single(alex,32)
b = single(wang, 43)

print(a.name)
print(b.name)

 

python之魔法方法

原文:https://www.cnblogs.com/pathping/p/11621683.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!