python类的特殊成员部分介绍

class Foo():
    def __init__(self, f1, f2):
        """
        在类中__new__()方法返回一个对象后执行,为对象封装变量。
        :param f1:
        :param f2:
        """
        self.f1 = f1
        self.f2 = f2
        print('foo类init', self)

    def __new__(cls, *args, **kwargs):
        """
        创建一个空对象,在执行 类名()的时候调用. 必须有返回值,返回一个空对象.python中所有的对象都是object创建的
        :param args:
        :param kwargs:
        :return:
        """
        obj1 = object.__new__(cls)
        print(obj1)
        return obj1

    def __call__(self, *args, **kwargs):
        print('foo类__call__()')

    def __getitem__(self, item):
        print('Foo类getitem', item)
        return 1

    def __setitem__(self, key, value):
        self.key = key
        self.value = value
        print('foo类__setitem__()方法', key, value)

    def __add__(self, other):
        ret = self.f2 + other.f1
        print('foo类__add__()方法')
        return ret

    def __delitem__(self, key):
        print('Foo类__delitem__()方法', key)

    def __enter__(self):
        print("Foo类__enter__()方法")
        return '__enter__()方法返回值'

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('Foo类__exit__()方法')


# 1. 类名() 自动执行__new__() ,  返回一个对象后自动执行__init__()
obj = Foo(1, 2)
obj2 = Foo(98, 99)

# 2. 对象() 自动执行__call__()
obj()

# 3 对象['k'] 自动执行 __getitem__() 可以定义返回值
a = obj['123']
print(a)

# 4. 对象['k'] = v 自动执行__setitem__() 无法返回值
# ret = obj['key'] = 'ssss' 只是相当于ret 跟 obj['key'] 被赋值'ssss'
obj['key'] = 'ssss'

# 5. 对象 + 对象  自动执行 __add__() ,将obj传递给self,将obj2传递给other,反之亦然。可以有返回值

s = obj + obj2
print(s)

# 6. del 对象['xx'] 自动执行 无法返回值 会传递给方法的参数key
del obj2['k']

# 7. with 对象  as f:  会自动执行__enter__()代码块 然后执行with下的代码块,出去的时候会自动执行__exit__()方法。__enter__()方法的返回值传递给as后的变量

with obj as f:
    print('with内部代码块', f)


#运行结果:
Foo类__new__()方法 <__main__.Foo object at 0x00000267B3F6CEF0>
foo类__init_()方法 <__main__.Foo object at 0x00000267B3F6CEF0>
Foo类__new__()方法 <__main__.Foo object at 0x00000267B3FEB278>
foo类__init_()方法 <__main__.Foo object at 0x00000267B3FEB278>
foo类__call__()方法
Foo类__getitem__()方法 123
1
foo类__setitem__()方法 key ssss
foo类__add__()方法
100
Foo类__delitem__()方法 k
Foo类__enter__()方法
with内部代码块 __enter__()方法返回值
Foo类__exit__()方法

补充:直接打印类名__str__,类的描述__doc__,对象封装的变量__dict__,是否可迭代__iter__

class Foo:
    """
这是个Foo类
    """

    def __init__(self, v1, v2):
        self.v1 = v1
        self.v2 = v2

    def __str__(self):
        """
        :return: 必须return一个字符串对象
        """
        return "类Foo的对象"

    # def __iter__(self):
    #     return iter([11, 22, 33, 44, 55])

    def __iter__(self):
        yield 11
        yield 22
        yield 33
        yield 44
        yield 55


obj = Foo(12, 34)
# 默认打印对象名,是打印对象的内存地址,但是可以通过在对象中定义__str__()方法,改变打印内容
print(obj, type(obj))

# 打印类的描述
print(obj.__doc__)

# 以字典的形式打印类中封装的变量及其值
print(obj.__dict__)

"""
如果想要把不可迭代对象--->可迭代对象
1. 在类中定义__iter__()方法
2. iter内部返回一个迭代器(生成器也是一种迭代器,所以可以在__iter__()方法中使用yield)
"""
for i in obj:
    print(i)

运行结果:

类Foo的对象 <class '__main__.Foo'>

这是个Foo类
    
{'v1': 12, 'v2': 34}
11
22
33
44
55
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值