Python入门(二十)——复习面向对象编程进阶知识——类特殊成员

1. 构造方法(__init__)和析构方法(__del__)

构造方法在前节讲过,在创建对象(类加括号)时候调用

对象被销毁时自动调用

'''上述两个方法举例'''
class MyClass:
    def __init__(self):
        print('创建对象', self)

    def __del__(self):
        print('销毁对象', self)

    def wait(self):
        for i in range(100000):
            pass
        print('等待结束')

obj = MyClass()
obj.wait()

执行结果:
在这里插入图片描述

2. __call__ 方法:对象加括号调用

'''__call__方法'''
class MyClass:
    def __call__(self, *args, **kwargs):
        print('调用call方法')


obj  = MyClass()
print('创建对象')
obj()

运行结果:
在这里插入图片描述

3. __str__ 方法:str()或print()会调用

'''__str__方法'''
class MyClass:
    def __str__(self):
        print('调用str方法')
        return 'you want'

obj  = MyClass()
print(obj)
s = str(obj)
print(s)

运行结果:
在这里插入图片描述

4. 加减乘除(用__add __举例)


'''加减乘除'''
class MyClass:
    def __add__(self, other):
        print('调用__add__方法', self)
        return 'you want __add__'

    def __sub__(self, other):
        print('调用__sub__方法', self)
        return 'you want __sub__'

    def __mul__(self, other):
        print('调用__mul__方法', self)
        return 'you want __mul__'

    def __divmod__(self, other):
        print('调用__divmod__方法', self)
        return 'you want __divmod__'

obj1  = MyClass()
obj2 = MyClass()

ret = obj1 + obj2
print(ret)


ret = obj1 - obj2
print(ret)


ret = obj1 * obj2
print(ret)


ret = obj1 // obj2
print(ret)

在这里插入图片描述
不知道除法咋写

5. 字典方法(__dict __)

返回对象中的所有内容,一般就是存入对象内存的字段的值
类调用的话会返回类中所有内容,这个一般用的比较多

'''字典方法'''
class MyClass:
    '''这是类的注释'''
    country = 'china'
    def __init__(self, age):
        self.name = 'zhao'
        self.age = age

    def myfoo(self):
        print(self.name)
        pass


obj = MyClass(24)
print(obj.__dict__)
print(MyClass.__dict__)

执行结果:
在这里插入图片描述

6. 列表方法 [ ](__getitem __、__setitem __、__delitem __)

'''列表方法(__getitem __、__setitem __、__delitem __)'''
class MyClass:
    def __init__(self, lst):
        self.mylist = lst

    def __getitem__(self, item):
        print('调用getitem')
        return self.mylist[item]

    def __setitem__(self, key, value):
        self.mylist[key] = value

    def __delitem__(self, key):
        del self.mylist[key]

obj = MyClass([1, 2, 3, 4, 'zhao'])
print(obj[1])
obj[1] = 'ren'
print(obj[1])
del obj[1]
print(obj[1])

运行结果:
在这里插入图片描述

7. 列表切片[a: b: c] (还是getitem方法)

相当于传入的参数item变为slice(切片),加入type(item)==slice判断即可完成

'''列表切片[a: b: c] (还是getitem方法)'''
class MyClass:
    def __init__(self):
        self.list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    def __getitem__(self, item):
        if type(item) == slice:
            start = item.start
            stop = item.stop
            step = item.step
            print(start, stop, step)
            return self.list[start:stop:step]

obj = MyClass()
print(obj[-1::-2])
print(obj[0:6])
print(obj[0:6:2])

运行结果
在这里插入图片描述

8. 迭代方法(__iter(self) __)

'''迭代方法(__iter(self) __)'''
class MyClass:
    def __init__(self):
        self.list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    def __iter__(self):
        return iter(self.list)

obj = MyClass()
for i in obj:
    print(i)

运行结果,不报错,自动进行next()方法迭代

9. __new __ 和 __metaclass __(知道过程即可)

第一阶段:解释器从上到下执行代码创建Foo类
对于type类,Foo相当于是对象,因此先执行MyType类中的__init__方法

第二阶段:通过Foo类创建obj对象
当Foo()加括号时相当于对象加括号,调用MyType类中的__call__方法
__call__方法用Foo新建对象,并调用新建对象的__init__方法

class MyType(type):
    def __init__(self, what, bases=None, dict=None):
        print('MyType.__init__')
        super(MyType, self).__init__(what, bases, dict)

    def __call__(self, *args, **kwargs):
        obj = self.__new__(self, *args, **kwargs)
        self.__init__(obj)


class Foo(object):
    __metaclass__ = MyType
    def __init__(self, name):
        self.name = name

    def __new__(cls, *args, **kwargs):
        return object.__new__(cls, *args, **kwargs)
# 第一阶段:解释器从上到下执行代码创建Foo类
#          对于type类,Foo相当于是对象,因此先执行MyType类中的__init__方法
#
# 第二阶段:通过Foo类创建obj对象
#          当Foo()加括号时相当于对象加括号,调用MyType类中的__call__方法
#          __call__方法用Foo新建对象,并调用新建对象的__init__方法
obj = Foo('zhao')
print(obj.name

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值