zoukankan      html  css  js  c++  java
  • Python 看书的一些记录 运算符重载

    1.类和模块有什么关系?

      (1)类是模块的一部分,是模块对象的属性。

      (2)类和模块都是命名空间,但是类是对于语法的。模块是对于文件的

      (3)类支持多个实例,但是模块被导入时只有一个。

    2.什么是抽象超类(抽象基类)?

      抽象超类就是指类的部分行为需要由其子类提供

    class Person(object):
        """docstring for Person"""
        def __init__(self,name):
            self.name = name
        def test_func(self):
            self.action() # 实现action方法需要在子类中定义进行调用
    
    
    class Teacher(Person):
        """docstring for Teacher"""
        def action(self):
            print(self.name)
            
    if __name__ =="__main__":
        teacher = Teacher("sunqi")
        teacher.test_func()

     3.Python中的迭代环境都会先尝试调用__iter__方法,如果没有才会调用__getitem__方法进行索引取值。

    • 每次进行迭代,都会尝试用对象的iter内置函数去调用__iter__方法,返回一个迭代器对象,然后不断调用返回对象的next方法,

        直到发生StopIteration异常

    • 若没有__iter__方法,就会调用__getitem__方法,不断索引取值,直到发生IndexError异常。

    4.类中的__getattr__与__setattr__

    __getattr__ 会在类中查找属性时调用。

    __setattr__ 会在设置属性时调用

    __getattribute__会在查找属性时调用(无论属性是否存在)

    class Test(object):
        def __init__(self,data):
            self.data = data
        def __getattribute__(self,attrname):
            print("__getattribute__")
            return object.__getattribute__(self,attrname)
        def __getattr__(self,attrname):
            print("__getattr__")
            if attrname == "age":
                return 40 
            else :
                return AttributeError
        def __setattr__(self,attrname,value):
            print("__setattr__")
            self.__dict__[attrname] = value
            # self.__setattr__(attrname,value)
    
    if __name__ == "__main__":
        t = Test("test")
        print(t.data)
        print("*" * 10)
        print(t.age)
        print("*" * 10)
        print(t.name)
        t.name = "sunqi"
    

    __setattr__
    __getattribute__
    __getattribute__
    test
    **********
    __getattribute__
    __getattr__
    40
    **********
    __getattribute__
    __getattr__
    <class 'AttributeError'>
    __setattr__
    __getattribute__

     5.右侧加法和原处加法__radd__ , __iadd__

    当加号右侧是类实例,左侧不是类实例才会调用__radd__,其他情况都会由左侧对象调用__add__方法(了解一下)

    __iadd__ 实现了+=功能

  • 相关阅读:
    运算符的优先级
    运算符
    值类型与引用类型的区别
    进制转换
    Java总结第二期
    Java总结第一期
    库存管理系统
    MyBank后感
    day72
    day71
  • 原文地址:https://www.cnblogs.com/SunQi-Tony/p/9903170.html
Copyright © 2011-2022 走看看