python之魔法方法

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方法了‘)
    def call(self):
        print(‘执行call方法了‘)
class B:
    def __init__(self,cls):
        print(‘在实例化A之前做一些事情‘)
        self.a = cls()
        self.a()
        print(‘在实例化A之后做一些事情‘)
a = A()
a()  # 对象() == 相当于调用__call__方法
a.call()

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):  # 在实例化之后,__init__之前先执行new来创建一块空间
        obj = object.__new__(cls)   # Single的new,Single没有,只能调用object的new方法
        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)

__str__ 方法

class Student:
    def __str__(self):
        ‘‘‘
        :return: 返回自定义内容
        ‘‘‘
        return f"{self.school} {self.class_name} {self.name} {self.age}"

    def __init__(self, school, class_name, name):
        self.school = school
        self.class_name = class_name
        self.name = name
        self.age = 20

name1 = Student(‘oldboy‘, ‘py‘, ‘alex‘)
name2 = Student(‘oldboy‘, ‘py‘, ‘abc‘)

print(name1)  # 直接调用对象输出自定义内容,需要使用__str__方法
print(str(name1))   # 内置的数据类型,内置的类,相当于执行__str__
print(‘学生: %s‘ % name1)
print(f‘学生:{name1}‘)

# print一个对象相当于调用一个对象的__str__方法
# str(obj),相当于执行obj.__str__方法
# ‘%s‘%obj,相当于执行obj.__str__方法

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

时间: 2024-10-27 16:18:37

python之魔法方法的相关文章

Python 常用魔法方法(下)

Python 常用魔法方法(下) 回顾 魔法方法是 Python 内置方法, 不需要我们手动调用, 它存在的目的是给 解释器 调用的. 比如我们在写 "1 + 1 " 的时候, 这个 "+ " 就会自动调用内置的魔法方法 "__ add__" . 几乎每个魔法方法, 都有一个对应的内置函数或运算符. 当我们使用这些方法去操作数据时, 解释器会自动调用这些对应的魔法方法. 也可以理解为, 重写内置函数, 如果改变的话. 具体的魔法方法等. 可以去看

21 python的魔法方法(转)

魔法方法 含义   基本的魔法方法 __new__(cls[, ...]) 1. __new__ 是在一个对象实例化的时候所调用的第一个方法2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法3. __new__ 决定是否要使用该 __init__ 方法,因为 __new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__ 没有返回实例对象,则 __init__ 不会被调用4. __new__ 主要是用于继承一个不可变的类型比如

python中魔法方法__str__与__repr__的区别

提出问题 当我们自定义一个类时,打印这个类对象或者在交互模式下直接输入这个类对象按回车,默认显示出来的信息好像用处不大.如下所示 In [1]: class People: ...: def __init__(self, name, sex): ...: self.name = name ...: self.sex = sex ...: In [2]: p = People('xiaoming', 'male') In [3]: p Out[3]: <__main__.People at 0x7

python中的魔法方法

1.什么是魔法方法? 魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的.它们经常是两个下划线包围来命名的(比如 __init__,__lt__),Python的魔法方法是非常强大的,所以了解其使用方法也变得尤为重要! 2.__init__(self[, ...]),__new__(cls[, ...]),__del__(self) __init__ 构

python 魔法方法(学习过程的笔记)

有小伙伴会问,什么是python的魔法方法,python的魔法方法有什么用呢, 它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两个下划线包围来命名的. 我感觉魔法方法很牛逼的, 目前我们常见的魔法方法大致可分为以下几类: 构造与初始化 类的表示 访问控制 比较操作 容器类操作 可调用对象 Pickling序列化 在我们写python中最常见的就是__init__,这是python的构造方法,这是初始化对象,定义一个对象的初始化的值,_

python 魔法方法之:__getitem__ __setitem__ __delitem__

python的魔法方法: 在Python中,如果我们想实现创建类似于序列和映射的类,可以通过重写魔法方法__getitem__.__setitem__.__delitem__.__len__方法去模拟. __getitem__(self,key):返回键对应的值. __setitem__(self,key,value):设置给定键的值 __delitem__(self,key):删除给定键对应的元素. __len__():返回元素的数量 下面我们模仿dict创建自己的类: class MyDic

python_魔法方法(二):算术运算

python2.2之后,对类和类型做了同意,将int().float().str().list().touple()这些BIF转换为工厂函数 >>> type(len) <class 'builtin_function_or_method'> >>> type(int) <class 'type'> >>> type(dir) <class 'builtin_function_or_method'> >>

python_面向对象魔法方法指南

原文: http://www.rafekettler.com/magicmethods.html 原作者: Rafe Kettler 翻译: hit9 原版(英文版) Repo: https://github.com/RafeKettler/magicmethods Contents (译)Python魔法方法指南 简介 构造方法 操作符 比较操作符 数值操作符 一元操作符 常见算数操作符 反射算数运算符 增强赋值运算符 类型转换操作符 类的表示 访问控制 自定义序列 预备知识 容器背后的魔法方

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称