zoukankan      html  css  js  c++  java
  • 面向对象相关

    面向对象的三大特征

    封装 : 把固定功能的代码封装到一个代码块,函数,对象,打包成模块

    继承 : 子类可以自动拥有父类中除了私有属性外的其他所有内容

    多态 : 同一个对象,多种形态

    类的成员 

     变量 : 

    1.实例变量(字段) : 给对象用的

    2.类变量(静态变量) : 多个对象共享的.最好是用类名来访问

    方法 :

    1.成员方法(实例方法) : 对象直接访问的方法叫成员方法

    2.静态方法 : 不需要给方法传递self

    @staticmethod
    def func():
        pass

    3.类方法 : 类方法被调用时也不需要传递实例对象

    @classmethod
    def func1(cls, a, b):
        pass

    属性:

    class Person:
        def __init__(self, name, gender, birth):
            self.name = name
            self.gender = gender
            self.birth = birth  # 2000  2018
        # 年龄 -> 应该是算出来的. 而不是直接存储
        @property # 把一个方法更改成一个属性, 每次拿属性的时候都会自动的去执行这个方法
                       # 方法的返回值就是属性值
        def age(self):  # 实例方法
            print("我是方法")
            return 2018 - self.birth

    1. 方法参数只能有一个self

    2. 方法上方要写@property

    3. 调用的时候,不需要写括号.直接当成属性变量来用就可以了

    私有:

    使用__作为前缀,那么这个方法或者变量就是一个私有的

    私有变量 : self.__age = age  

    私有方法 : def __age(self):  pass

    类与类之间的关系:

    1. 依赖关系

    2. 关联关系

    3. 组合关系

    4. 聚合关系

    5. 继承关系 : self就是你访问方法的那个对象,先找自己,再找父类

    6. 实现关系

    类中的特殊成员

    1. 类名()会自动执行__init__()

    2. 对象()会自动执行__call__()

    3. 对象[key]会自动执行__getitem__()

    4. 对象[key] = value 会自动执行__setitem__()

    5. del 对象[key]会自动执行__delitem__()

    6. 对象+对象会自动执行__add__()

    7. with对象as变量会自动执行__enter__和__exit__

    8. 打印对象的时候会自动执行__str__

    9. 去掉hash __hash__ == None 对象就不可哈希了

    创建对象的步骤 :  加载类 → 开辟内存(__new__) → 初始化(__init__) → 使用对象调用方法

    isinstance, type, issubclass函数

    issubclass(Bar, Foo) 这个内置函数判断xx类是否是xxx类型的子类

    type(obj) 查看obj是由哪个类创建的

    isinstance(Foo(), Foo) 判断xxx是xx类型的数据,没有type精准,只能往上判断,是否是XX家族体系中的

    函数和方法

    1. 类方法.不论任何情况,都是方法

    2. 静态方法,不论任何情况.都是函数

    3. 实例方法,如果是实例访问.就是方法.如果是类名访问就是函数

    types模块

    from types import MethodType, FunctionType
    def func():
        pass
    print(isinstance(func, FunctionType))  # True
    print(isinstance(func, MethodType))    # False 

    1.getattr(obj, str) : 从对象中获取到xxx功能, getattr可以从模块中获取内容,也可以从类中获取,也可以从对象中获取

    2.hasattr(obj,str) : 判断xxx中包含了xx功能

    3.setattr(obj, str, value)把obj中的str成员设置成value.value可以是值,也可以是函数或者方法

    4.delattr(obj, str)把obj中的str成员删除掉

    以上方法都是内存中进行的,并不会影响源代码

    约束

    1.提取一个父类,再父类中给出一个方法,并在方法中不给出任何代码.直接抛出异常

    class Base:
        def login(self):
            raise Exception('未实现login()')
    
    class Student(Base):
        def login(self): #如果子类找不到对应的方法,父类则会报错
            pass

    2.写抽象类和抽象方法 

    from abc import ABCMeta, abstratmethod
    
    class Base(metaclass = ABCMeta):
        @abstractmethod
        def login(self):
            pass
    class Normal(Base):
        def login(self):
            pass
  • 相关阅读:
    表单提交:button input submit 的区别
    JavaScript中改变this指针的注意事项
    宝塔服务器配置nginx刷新404的问题汇总
    ES6笔记整理
    axios网络请求
    v-model双向绑定
    v-bind动态绑定
    前端模块化
    vue router 路由
    JS高阶函数
  • 原文地址:https://www.cnblogs.com/gracenana/p/10209763.html
Copyright © 2011-2022 走看看