zoukankan      html  css  js  c++  java
  • python OOP

    object oriented programming

    干啥的

    1.避免重名(封装)
    2.避免代码重复(继承)
    3.将复杂的流程抽象地封装起来
    4.模块化程度高,应对复杂编程问题

    1)划分职责-要做的事情方法:函数
    2)根据行使职责主体:区分不同的对象
    3)一个对象实现多个职责:封装多个不同的方法

    特征:
    封装,继承,多态

    类,对象(实例)

    属性,行为(方法) 抽象成类
    类实例化成对象

    类命名:每个单词首字母大写,中间无下划线连接

    类是一个特殊的对象,也会被加载到内存,但只有一份
    类属性,类方法; 实例属性,实例方法;静态方法
    实例会优先查找实例属性,再找类属性。 类属性也可以继承

    class Person:
        count = 0 #__init__外的是类属性,类似static   这里用于记录这个类创建了几个实例(有几个人)
    
        @classmethod
        def f(cls): #类方法
            print(cls.count) #cls. 可以调用类属性和类方法
    
        @staticmethod
        def run(): #静态方法 
            print("人在跑")#不需要使用类属性类方法也不需要使用实例属性和实例方法
    
        def __init__(self, name): #实例方法
            self.name = name #__init__里的是 实例属性
            Person.count += 1 #用 类名. 访问类属性
    
    x = Person('zhao')
    Person.f() #类名调用
    Person.run()或x.run() #均可
    

    访问类属性/方法时不要用实例.,应该用类.,否则可能会出现新建了一个实例属性的问题
    注意类属性是会继承的,但是有些毛病。如A,B(A),C(B), 如果只在A中定义类属性cnt
    那么A.cnt+=1是使A,B,C得cnt都加1,B.cnt+=1是使B,C的cnt都加1.即后继加

    封装

    继承是不会创建父类的实例的,即不会调用父类的__init__
    dir(a)用于获得 类/对象 a中的 属性/方法

    a.blabla=blabla可以给对象添加属性(不建议!)
    __name私有属性或私有方法。本质被python处理成了_类名__name,所以是伪私有

    __init__(self,...)方法,类实例化时的初始化函数,构建类时()内的东西即init中传参。属性可在这里定义
    __del__(self)方法,类被回收时调用. 如程序结束或使用del classname
    __str__(self)方法,类被print时显示什么。必须返回字符串。默认返回类名+地址
    __new__(cls)方法,构建类时先调用new分配空间再init。默认调用super().__new__(cls)

    __mro__属性,类被调用方法的查找顺序。如多继承时C(A,B)先看C再看A再看B再看object

    继承

    class 子类(父类): 或称作派生类(基类)
    class 子类(父类1,父类2,...):多继承,避免又重复方法。
    联系__mro__思考上面多继承的重复方法问题,和继承时的方法重写

    python3会自动在最靠后的位置继承object类,内有一些类的基本属性和方法(新式类)
    而python2中默认没有继承object类(经典类)
    所以为了兼容,用class A(object),而class B(A)没必要再加object(爷爷边没有用)

    多态

    用相同方法名即可重写方法
    在新方法内用super().方法可以调用直接父类的方法(不能是父实例),可用于原方法的扩展

    单例

    使用模块
    或修改__new__(cls),增加类属性instance,存储None或对象地址,在new里加if语句判断该变量是否为None
    这样每一次调用cls()返回的地址相同,称单例

    如果要避免每次初始化,__init__同理设置类属性flag即可
    如果要实现回收, __del__里恢复init的flag和new的instance即可

  • 相关阅读:
    linux下mysql忘记密码
    ORACLE 锁表处理,解锁释放session
    二.hadoop环境搭建
    并行与并发的理解
    PgSQl临时表的创建
    UNION types numeric and text cannot be matched
    Excel 自定义关闭按钮
    Excel关闭事件
    VBA 获得绝对地址控制焦点的设置
    Excel TargetRange.Validation为空的
  • 原文地址:https://www.cnblogs.com/acha/p/11115297.html
Copyright © 2011-2022 走看看