01类内置方法

# 写一个单例类# __名子__   # 类中的特殊方法、内置方法   # 双下方法   # 魔法方法

# __call__ flask# __new__ 特别重要 写一个单例类# __len__# __str__ /__repr__

__call__

# __call__ flask

class A:
    def __call__(self, *args, **kwargs):
        print("执行__call__方法")
#
# a = A()
# a()   # 对象加()执行call方法
# A()()
#
# # 执行__call__方法
# # 执行__call__方法

class B:
    def __init__(self,cls):
        print("在实例化A之前做一些事情")
        self.a = cls()
        self.a()
        print("在实例化A之后做一些事情")
B(A)   # 很多源码都是这样写的

__len__  对对象执行len函数里面必须要有__len__方法

# __len__
#len()
# __iter__
#iter
# __next__
# next()
# l = [1,2,3]
#
# def it(obj):
#     return obj.__iter__()
# # print(it(l))

class Mylist():
    def __init__(self):
        self.lst = [1,2,3,4,5,6]

    def __len__(self):
        print("执行__len__函数")
        return len(self.lst)   # 在对对象进行操作时,可以修改,让len执行你想要的操作

l = Mylist()
# print(l.lst)
# print(len(l))  # TypeError: object of type ‘Mylist‘ has no len()  对象没有长度。添加__len__ 函数

# print(len(l))  # 执行对象里面的len函数  # 当需要执行对象的len函数时,类里面必须有__len__函数

# 执行外部的len函数
ab = [1,2,3,4]
print(len(ab))

# 类
# self.s  = ""
# len(obj)   = str长度

class Test:
    def __init__(self,s):
        self.s = s
    def __len__(self):
        return len(self.s)
t = Test("abafhaifhakj")
print(len(t))

__new__  单例类  (构造方法) __init__ 不是构造方法,是初始化方法

class Single:
    def __new__(cls, *args, **kwargs):
        obj = object.__new__(cls)
        print("在new方法里面", obj)
        return obj   # 这里执行new方法,返回对象空间。在执行new方法时,传递cls,因为此时没有对象空间self ,所哟只能传递cls 类空间
    # 正常情况下不需要执行new函数,因为继承的objecr会自动执行

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

# 实例化过程中先开辟一个空间,属于对象的
# 把对象空间传递给self ,执行init
# 将这个对象空间返回给调用者
obj = Single()
# 在new方法里面 <__main__.Single object at 0x000001B97B41B4A8>
# init <__main__.Single object at 0x000001B97B41B4A8>
# 先执行Single的new方法,Single里面没有,所以执行Object里面的new方法
# new方法在实例化对象的时候,在__init__之前

# 单例类 如果一个类只能创建一个实例.只开辟一个空间,那么这个类就是单例类

class B:
    __ISINSTANCE = None
    # def __new__(cls, *args, **kwargs):
    #     global obj
    #     if not cls.__ISINSTANCE:
    #         obj = object.__new__(cls)
    #         cls.__ISINSTANCE = True
    #     return obj  # UnboundLocalError: local variable ‘obj‘ referenced before assignment  赋值之前引用了局部变量obj
    def __new__(cls, *args, **kwargs):
        if not cls.__ISINSTANCE:
            cls.__ISINSTANCE = object.__new__(cls)
        return cls.__ISINSTANCE # UnboundLocalError: local variable ‘obj‘ referenced before assignment  赋值之前引用了局部变量obj

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

b1 = B("ly",999)
b2 = B("dudu",666)
print(b1.name)
print(b2.name)

__str__

# __str__
l = [1,2,3] # 相当于实例化一个list的对象
# # l 是一个对象
print(l)

class Student:
    # def __str__(self):
    #     return "{} {} {}".format(self.name,self.school,self.age)

    def __init__(self,name):
        self.name = name
        self.school = "good"
        self.age = 26

ly = Student("liuy")
print(ly.name)
# print(ly)
print(str(ly))
# print("学生1: %s" % ly)

# print一个对象相当于调用一个对象的__str__ 方法
# 实现强转时,str(obj)相当于执行__str__方法
# str(obj)相当于执行obj.__str__方法
# %obj 相当于执行obj.__str__ 方法

所有的魔术方法没有需要在外面直接调用的,通常在类里面实现这些方法,然后在外部通过对象调用时,可以影响这些方法

原文地址:https://www.cnblogs.com/yfjly/p/10600153.html

时间: 2024-07-30 13:35:46

01类内置方法的相关文章

反射和类内置方法

# class Teacher: # dic = {'查看学生信息': 'show_student', '查看老师': 'show_teacher'} # # def show_student(self): # print('show student') # # def show_teacher(self): # print('show teacher') # # @classmethod # def func(cls): # print('func') # # chen = Teacher()

python类内置方法的再学习

对于__setitem__和__getitem__方法:其入参看来是固定的(__getitem__(self, item),__setitem__(self, key, value)),我们并不需要重载实现,另外:类变量看来可以被实例化对象直接使用 class wenwa: myname = "陈培昌" myinfo={'name':'陈培昌',"age":22,"favorite":'喜欢练搏击,跳舞'} def sniff(self): pr

01 列表内置方法

'''''' ''' 列表: 在[]内,可以存放多个任意类型的值,并以逗号隔开. 一般用于存放学生的爱好,课堂的周期等等 ''' #定义一个学生列表,可存放多个学生 #本质上是list(['钱垚','张天爱','邢菲','林一']) students = ['钱垚','张天爱','邢菲','林一'] print(students[1]) student_info = ['林一',19,'smale',['滑板','跳舞']] #取林一同学所有爱好 print(student_info[3]) #

python 字符串内置方法整理

编码相关内置方法: (1)    str.encode(encoding='utf-8'):返回字符串编码,encoding指定编码方式. >>> a = 'I love Python' >>> a.encode(encoding='utf-8') b'I love Python' >>> a.encode(encoding='gbk') b'I love Python' >>> b.encode(encoding='utf-8')

python 类中内置方法的重写

为达成目的,经常会在类中将一些内置方法进行重写,最常见的例如__setattr__,下面就通过内置属性,来查看重写会带来什么变化 先定义一个测试用的类,代码如下 class base: def __init__(self): pass inspect.getmembers(base): # 查看内置属性 打印结果如下 ('__class__', <class 'type'>) ('__delattr__', <slot wrapper '__delattr__' of 'object'

[python] 类常用的内置方法

内置方法 说明 __init__(self,...) 初始化对象,在创建新对象时调用 __del__(self) 释放对象,在对象被删除之前调用 __new__(cls,*args,**kwd) 实例的生成操作 __str__(self) 在使用print语句时被调用 __getitem__(self,key) 获取序列的索引key对应的值,等价于seq[key] __len__(self) 在调用内联函数len()时被调用 __cmp__(stc,dst) 比较两个对象src和dst __ge

Python之面向对象:类的内置方法

1.def __add__(self,other): c1+c2 两个实例的加法操作就是执行__add__()方法 2.__str__(self): print一个实例的时候,执行的是__str__()这个内置方法 eg: class Vector(object): def __init__(self,a,b): self.a = a self.b = b def __str__(self): return 'Vector(%d,%d)'%(self.a,self.b) def __add__(

类的属性、类的方法、类的内置方法

类的属性 变量在类中称为类的属性,函数在类中称为类的方法,类的属性分为以下几种: (1) 公有属性:在类中和类外都能调用的属性,定义的时候与变量的定义一致,如 color = 'yellow'(2) 私有属性:不能在类外及被类以外的函数调用,定义的时候以双下划线开头,如__color = 'yellow' (3) 内置属性: 由系统在定义类的时候默认添加的,定义的时候以前后双下划线构成,如 dict #!/usr/bin/env python class People(object): colo

Python类的内置方法

目录 1.new.init 2.str.repr 3.call 4.del 5.iter.next 6.getitem.setitem.delitem 7.getattr.setattr.delattr 8.getatrribute 9.enter.exit 10.get.set.delete.描述符(研究中,待补充) **(为了方便和美观,省略了各内置方法前后的__双下划线)** 1.new.init __new__方法是真正的类构造方法,用于产生实例化对象(空属性).重写__new__方法可