美文网首页python复习100天
python复习第12天:面向对象编程(下)

python复习第12天:面向对象编程(下)

作者: 潮办公 | 来源:发表于2020-04-06 23:20 被阅读0次

    title: python复习第12天:面向对象编程(下)
    date: 2020-04-04 21:00:24
    tags:
    - python
    - 基础
    categories: python复习
    top: 13


    面向对象编程(下)

    实例方法与静态方法

    • 实例方法:必须实例化之后才能调用,其必须有一个self参数
    • 静态方法:不需要self参数,可以直接调用的方法
    class Person(object):
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def talk(self):
            print('我是{}, 我今年多大了'.format(self.name, self.age))  # 函数体用了self,所以这个应该定义为实例方法
    
        @staticmethod  # 定义为静态函数,即不需要写self参数
        def eat():
            print('我在吃饭')
    
    
    p = Person('小明', 18)
    p.talk()
    p.eat()
    """
    我是小明, 我今年多大了
    我在吃饭
    """
    

    类相关函数

    • issubclass:检测类是否为相关类的子类
    class A:
        pass
    
    
    class B(A):
        pass
    
    
    print(issubclass(B, A))
    # 输出结果
    """
    True
    """
    
    • isinstance:检测一个对象是否为一个类的实例
    class A:
        pass
    
    
    a = A()
    print(isinstance(a, A))
    # 输出结果
    """
    True
    """
    
    • hasattr:检测一个对象是否有具有相关属性
    class A:
        name = "NoName"
        pass
    
    
    a = A()
    print(hasattr(a, 'name'))
    print(hasattr(A, 'name'))
    # 输出结果
    """
    True
    """
    
    • getattr:获取属性
    class Person(object):
        def __init__(self, name):
            self.name = name
    
    
    p = Person('小明')
    n = getattr(p, 'name')  # 获取实例a的name属性
    print(n)
    """
    小明
    """
    
    • setattr:设置属性
    class Person(object):
        def __init__(self, name):
            self.name = name
    
    
    p = Person('小明')
    setattr(p, 'name', '小花')  # 获取实例a的name属性,并且赋值小花
    print(p.name)
    """
    小花
    """
    
    • delattr:删除属性
    class Person(object):
        def __init__(self, name):
            self.name = name
    
        def eat(self):
            print('我在吃饭')
    
    
    p = Person('小明')
    delattr(p, 'name')
    print(p.name)
    """
    AttributeError: 'Person' object has no attribute 'name'
    """
    
    • dir:列举所有属性和方法
    class Person(object):
        def __init__(self, name):
            self.name = name
    
        def eat(self):
            print('我在吃饭')
    
    
    p = Person('小明')
    print(dir(p))
    print(dir(Person))
    """
    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
     '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', 
     '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
      '__weakref__', 'eat', 'name']
      
    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
     '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', 
     '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 
     '__weakref__', 'eat']
    """
    

    类的内置属性

    • 即类在构建的时候,类自动创建的属性
    • 该属性可以理解为来自python定义好的object类
    • __class__:获取类的名称
    class Person(object):
        def __init__(self, name):
            self.name = name
    
    
    p = Person('小明')
    print(p.__class__)
    """
    <class '__main__.Person'>
    """
    
    • __dict__:获取储存在类或者实例中的所有属性与方法,以字典的形式展示,从下面的结果可以看出,类的属性与方法储存在类中,实例调用的时候也还是从类那里借用而不是复制一份。
    class Person(object):
        def __init__(self, name):
            self.name = name
    
        def eat(self):
            pass
    
    p = Person('小明')
    print(p.__dict__)
    print(Person.__dict__)
    """
    {'name': '小明'}
    {'__module__': '__main__', '__init__': <function Person.__init__ at 0x7f972e5ad3b0>, 
    'eat': <function Person.eat at 0x7f10febf2ef0>
    '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__':
     <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
    """
    

    __doc__:查看类的说明文档

    class Person(object):
        """
        我是说明文档
        """
    
        def __init__(self, name):
            self.name = name
    
        def eat(self):
            pass
    
    p = Person('小明')
    print(p.__doc__)
    """
    
        我是说明文档
        
    
    """
    

    类的魔法方法

    • 魔术方法就是不需要认为调用的方法,基本是在特定的时刻自动触发。
    • 魔术方法的统一特征,方法名前后两个下划线包裹

    操作类

    • __init__:构造函数,对象实例化的时候自动运行
    • __call__:当对象被当成函数调用的时候自动触发
    class Person:
        pass
        
        def __call__(self):
            """
            当把实例化对象当成函数的时候自动调用
            """
            print('恭喜你被调用了')
    p = Person()
    p()
    """
    恭喜你被调用了
    """
    
    • __str__:当对象被当成字符变量直接打印的时候触发
    class A:
        pass
    
    
    class B:
        def __str__(self):
            print('我被当字符串变量了')
            return '我是B类'
    a = A()
    b = B()
    print(a)
    print(b)
    """
    <__main__.A object at 0x7f277339c290>
    我被当字符串变量了
    我是B类
    """
    

    描述类

    • __setattr__:对成员属性进行设置的时候触发
    class Person(object):
    
        def eat(self):
            pass
    
        def __getattr__(self, name):
            print('没有这个东东,{}不存在'.format(name))
    
    
    p = Person()
    getattr(p, 'name')
    """
    没有这个东东,name不存在
    """
    
    • __len__:成员属性进行计算长度的时候调用
    class Person(object):
    
        def eat(self):
            pass
    
        def __len__(self):
            return 0  # 无论长度是多少,我都让它计算为零
    
    
    p = Person()
    print(len(p))
    """
    0
    """
    
    • __del__:对象被删除的时候自动调用
    class Person(object):
        def __init__(self, name):
            self.name = name
    
        def __del__(self):
            print('有一个元素被删除了')
    
    
    p = Person('小明')
    del p.name
    """
    有一个元素被删除了
    """
    

    数学运算类

    • __add__:对象之间进行加法运算的时候自动调用
    class Person(object):
        def __init__(self, name):
            self.name = name
    
        def __add__(self, other):
            return self.name + other.name
    
    
    p = Person('小明')
    p2 = Person('小花')
    print(p + p2)
    """
    小明小花
    """
    
    • __sub__:对象之间做减法的时候自动调用
    class Person(object):
        def __init__(self, name):
            self.name = name
    
        def __sub__(self, other):
            return self.name + other.name
    
    
    p = Person('小明')
    p2 = Person('小花')
    print(p - p2)
    """
    小明小花
    """
    
    • __mul__:对象之间做乘法的时候自动调用
    class Person(object):
        def __init__(self, name):
            self.name = name
    
        def __mul__(self, other):
            return self.name + other.name
    
    
    p = Person('小明')
    p2 = Person('小花')
    print(p * p2)
    """
    小明小花
    """
    
    • __truediv__:除运算
    • __mod__:求余运算
    • __pow__:乘方运算

    相关文章

      网友评论

        本文标题:python复习第12天:面向对象编程(下)

        本文链接:https://www.haomeiwen.com/subject/nlrwphtx.html