码迷,mamicode.com
首页 > 编程语言 > 详细

python之魔法方法

时间:2019-10-04 13:07:02      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:student   one   iter   instance   多少   ini   class   单例   构造   

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__方法

 

python之魔法方法

标签:student   one   iter   instance   多少   ini   class   单例   构造   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!