python 面向对象- 内置函数

ernestwang 880 0

内置函数

  • 回顾
    内置函数 触发时机
    __ init __ 构造方法,创建完对象初始化时
    __ del __ 析构方法,对象即将销毁时
    __ getattr __ 获取不存在的属性
    __ setattr __ 设置属性
    __ delattr __ 删除属性
    __ getitem __ 当做字典操作,获取属性
    __ setitem __ 当做字典操作,设置属性
    __ delitem __ 当做字典操作,删除属性
    __ call __ 将对象当做函数调用时
    __ str __ 打印或转换为字符串时
  • repr与eval
    d = {'name': 'dahua', 'age': 18}
    
    # 得到对象的字符串表示形式
    s = repr(d)
    print(s, type(s))
    
    # 执行有效的python代码字符串
    d2 = eval(s)
    print(d2, type(d2))
    
    a = 10
    b = 20
    
    c = eval('a + b')
    # c = a + b
    print(c)
    • 自定义对象
    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        # 对象使用repr方法处理时会自动触发该方法
        # 通常返回对象的字符串表示形式
        def __repr__(self):
            # print('__repr__')
            return "Person('{}', {})".format(self.name, self.age)
    
        # 打印对象时会自动触发,若没有则会尝试__repr__,还没有返回 类名+地址
        def __str__(self):
            return 'name: {} age: {}'.format(self.name, self.age)
        
    xiaoming = Person('xiaoming', 18)
    
    s = repr(xiaoming)
    print(s)
    
    xm = eval(s)
    print(xm, type(xm))   
  • 算术运算符重载
    • 示例
    class Number:
        def __init__(self, num):
            self.num = num
    
        def __str__(self):
            return str(self.num)
    
        # 对象出现在 '+' 的左边时会自动触发
        def __add__(self, other):
            print('__add__')
            return self.num + other
    
        # 对象出现在 '+' 的右边是会自动触发
        def __radd__(self, other):
            print('__radd__')
            return self.num + other
    
        # '+='运算时会自动调用,若没有此方法,则会尝试__add__
        def __iadd__(self, other):
            print('__iadd__')
            self.num += other
            return self
    
    n = Number(10)
    
    # ret = n + 20
    # ret = 20 + n
    # print(ret)
    
    n += 20
    print(n)
  • 自己研究
运算 左边 右边 复合
减法 __ sub __ __ rsub __ __ isub __
乘法 __ mul __ __ rmul __ __ imul __
除法 __ truediv __ __ rtruediv __ __ itruediv __
求余 __ mod __ __ rmod __ __ imod __
  • 关系运算符重载
    class Number:
        def __init__(self, num):
            self.num = num
    
        # 大于 self > other 或 other < self
        def __gt__(self, other):
            print('__gt__')
            return self.num > other
    
        # 大于等于
        def __ge__(self, other):
            print('__ge__')
            return self.num >= other
    
        # 小于
        def __lt__(self, other):
            print('__lt__')
            return self.num < other
        
        # 小于等于
        def __le__(self, other):
            print('__le__')
            return self.num <= other
    
        # 等于
        def __eq__(self, other):
            print('__eq__')
            return self.num == other
    
        # 不等于:!=,若重写此方法则会调用,
        # 若没重写,则会尝试调用__eq__
        def __ne__(self, other):
            print('__ne__')
            return self.num != other
        
    n = Number(5)
    
    print(n > 4)
    print(4 < n)
    
    print(n < 4)
    print(4 > n)
    
    print(n == 4)
    print(n != 4)
    
    print(n >= 4)
    print(4 <= n)
    
    print(n <= 4)
    print(4 >= n)
  • __new__
    • 示例
    class Person(object):
        # 用于创建对象,需要返回创建的对象
        def __new__(cls, *args, **kwargs):
            print('__new__')
            return object.__new__(cls)
    
        def __init__(self):
            print('__init__')
            
    # p = Person.__new__(Person)
    # p.__init__()
    # 相当于上面的操作,但是不要这样用
    # p = Person()
    
    p1 = Person()
    p2 = Person()
    
    print(id(p1))
    print(id(p2))  

标签: python

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~

复制成功
微信号: irenyuwang
关注微信公众号,站长免费提供流量增长方案。
我知道了