单例类demo和内置函数(魔术方法)

本文介绍了Python中的单例类和内置魔术方法,包括`__new__`和`__init__`的重要性,以及如何创建单例类。同时讨论了`__len__`、`__str__`和`__repr__`等魔术方法的作用,强调了它们与内置函数的关系。
摘要由CSDN通过智能技术生成

知识点列表清单:

名字
1、这类方法叫做类中的特殊方法、内置方法,双下划綫方法、魔术方法
2、雷钟德每一个双下划线方法都有它自己的特殊意义
call flask
new :特别重要
* 写一个单例类
len
strrepr

# __call__
class A:
    def __call__(self,*args,**kwargs):
        print("我是call方法")
a = A()()  # 相当于a = A() a()
a # 相当于调用__call__方法
我是call方法
class B:
    def __init__(self,cls):
        self.a = cls()
        self.a()
B(A)
我是call方法





<__main__.B at 0x13f1fdc9fd0>
class Demo(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def my_print(self,):
        print("a = ", self.a, "b = ", self.b)

    def __call__(self, *args, **kwargs):
        self.a = args[0]
        self.b = args[1]
        print("call: a = ", self.a, "b = ", self.b)

if __name__ == "__main__":
    demo = Demo(10, 20)
    demo.my_print()
    demo(50, 60) #需要注意的是:只有当在类中定义了 def __call__() 方法后,才可以实现这个功能,否则会出现语法错误,就是文档中解释的 if this method is defined 的意思。
a =  10 b =  20
call: a =  50 b =  60

object.call(self[, args…])
  Called when the instance is “called” as a function; if this method is defined, x(arg1, arg2, …) is a shorthand for x.call(arg1, arg2, …).
主要实现的是将类的对象当作函数直接调用


# __iter__
def my_iter(obj):
    return obj.__iter__()
l = [1,2,3,4,5]
my_iter(l)
for i in my_iter(l):
    print(i)
1
2
3
4
5
# __len__ 方法
# len(tuple) str\list\set
class mylist:
    def __init__(self):
        self.lst = [1,2,3]
    def __len__(self):
        return 111
ls = mylist()
print(len(ls))  # len()方法其实就是调用的对象的__len__方法
111
class mylist:
    def __init__(self,lst):
        self.lst = lst
    def __len__(self):
        return len(self.lst)
ls = mylist([11,22,334,5,4,3,2,1])
print(len(ls))
8
小结:

len
len(obj)相当于调用了这个对象的__len__方法,__len__方法return的值就是len函数的返回值
内置函数和内置方法是有联系的。

new ==> 构造方法
init ==> 初始化方法

#面向对象实例化:
#1、开辟一个空间,属于对象的(__new__构造函数)
#2、把对象的空间传给self,执行init
#3、将这个对象的空间返回给调用者
class Single:
    def __new__(cls,*args,**kwargs):
        print("new")
        return object.__new__(cls)
        
    def __init__(self):
        print("init")
obj = Single()
# 先执行的__new__再执行的__init__方法
# 先调用single中的new方法,如果没有new方法则调用object类的new方法
new
init
单例类

如果一个类,从头到尾只能有一个实例,那么这个类就是单例类

class A:pass
a = A()
a1 = A()
print(a,a1)
<__main__.A object at 0x0000013F1FEA2550> <__main__.A object at 0x0000013F1FEA2518>
# 单例类
class A:      # step1
    __isinstance = None # step2
    def __new__(cls,*args,**kwargs): # step3   # step6 # step13
        if not cls.__isinstance:  # step7 # step14
            cls.__isinstance = object.__new__(cls) #step8
        return cls.__isinstance #step9 # step15
    def __init__(self):pass # step4 #step10 #step16
a = A()  # step5 #step11
a1 = A() # step12 # step17
print(a,a1)
<__main__.A object at 0x0000013F1FDC93C8> <__main__.A object at 0x0000013F1FDC93C8>
# __str__
ls = [1,2,3] #实例化一个list对象
print(ls)
[1, 2, 3]
# 不使用__str__
class A:
    def __init__(self,name):
        self.name =name
a = A("周杰伦")
print(a)
<__main__.A object at 0x0000013F1FDF5748>
# 使用__str__
class A:
    def __str__(self):
        return self.name + ',' + str(self.age)
    def __init__(self,name,age):
        self.name =name
        self.age = age
a = A("周杰伦",19)
print(a)
周杰伦,19
# str(oobj)相当于执行obj.__str__()方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值