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

    一.面向对象三大特性

    1.封装

    使用构造方法将内容封装到内容中,然后通过对象直接或通过self间接获取被封装的内容

    2.继承

    将多个类共有的方法提取到父类(基类)中,子类(派生类)仅需继承而不需要一一实现.

    支持多继承.python3中定义的都是新式类,python2中是经典类

    python继承顺序遵循3c算法

    class D(object):
        def bar(self):
            print 'D.bar'
    
    class C(D):
        def bar(self):
            print 'C.bar'
    
    class B(D):
        def bar(self):
            print 'B.bar'
    
    class A(B, C):
        def bar(self):
            print 'A.bar'
    a = A()
    # 执行bar方法时
    # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
    # 所以,查找顺序:A --> B --> C --> D
    # 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
    a.bar()
    
    新式类多继承

    3.多态

    多种状态,多种形态.

    二.方法

    方法包括:普通方法,静态方法和类方法.三种方法在内存中都归属于类,区别在于调用方式的不同.

    普通方法:由对象调用;至少一个self参数,执行普通方法时,自动将调用方法的对象赋值给self.

    类方法:由类调用,至少一个cls参数,执行方法时,自动将调用该方法的类赋值给cls.

    静态方法:由类调用.无默认参数.

    相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份.

    不同点:方法调用者不同,调用方法时自动传入的参数不同.

    三.属性

    在定义时候,在普通方法的基础上添加@property;属性仅有一个self参数

    class Foo:
        def func(self):
            print(123)
        @property              
        def prop(self):       #定义属性
            print(666)
    obj = Foo()
    obj.func()
    obj.prop

    .

    在调用时,无需括号 .方法:Foo_obj.func()

              属性:Foo_obj.prop

    属性存在的意义是:访问属性时可以制造和访问字段完全相同的假象.,属性由方法变种而来,如果python中没有属性,方法完全可以代替其功能.

    四.类成员的修饰符

    公有成员:在任何地方都可以访问

    私有成员:只能在类的内部才可以访问

    五.主动调用其他类的成员

    方式一:

    class Base(object):
         def f1(self):
                print('酸甜')
    class Foo(object):
         def f1(self):
                print('麻辣')
                Base.f1(self)
    obj = Foo()
    obj.f1()  #打印 麻辣,酸甜

    方式二:

    class Foo(object):
        def f1(self):
             super().f1()
             print('suantian')
    class Bar(object):
         def f1(self):
                print('mala')
    class Info(Foo,Bar):
          pass
    obj = Info()
    obj.f1()           #打印  mala ,suantian

    六.特殊成员

    1.类名() 自动执行  __init__

    2.对象() 自动执行 __call__

    3.对象['xx']      自动执行__getitem__

    4.对象['xx'] = 11 自动执行__setitem__

    5.del 对象[xx]  自动执行__delitem__

    6.对象+对象 自动执行 __add__

    7.with 对象  自动执行__enter__ (开始) /     __exit__(结束)

    8.真正 的构造方法

    class Foo(object):
        def __init__(self, a1, a2):     # 初始化方法
            """
            为空对象进行数据初始化
            :param a1:
            :param a2:
            """
            self.a1 = a1
            self.a2 = a2
    
        def __new__(cls, *args, **kwargs): # 构造方法
            """
            创建一个空对象
            :param args:
            :param kwargs:
            :return:
            """
            return object.__new__(cls) # Python内部创建一个当前类的对象(初创时内部是空的.).
    
    obj1 = Foo(1,2)
    print(obj1)
    
    obj2 = Foo(11,12)
    print(obj2)

     9.__dict__

    class Foo:
        def __init__(self,name,age):
            self.name = name
            self.age = age
        def func(self):
            pass
    obj1 = Foo('liu','18')
    obj2 = Foo('wu','17')        #打印{'name': 'liu', 'age': '18'}                                            
                                          #打印{'name': 'wu', 'age': '17'}
    print(obj1.__dict__)          
    print(obj2.__dict__)                                                                                              

    10.__iter__

    如果想要把不可迭代对象转化为可迭代对象:1,在类中定义__iter__方法,2.iter内部返回一个迭代器

    11.issubclass()

    class Foo:
        pass
    class Base(Foo):
        pass
    class Bar(Base):
        pass
    print(issubclass(Bar,Foo))  #打印True  判断第一个元素是否是第二个元素的子子孙孙类

    12.type()   获取当前元素由哪个类创建

    class Foo:
        pass
    obj = Foo()
    print(type(obj))    #打印<class '__main__.Foo'>

    13.isinstance()   检查第一个参数(对象)是否是第二个参数(类及父类)的实例

    class Base():
       pass
    class Foo(Base):
      pass
    obj1 = Foo()
    print(isinstance(obj1,Foo))  #打印True
    print(isinstance(obj1,Base))  #打印True
    obj2 = Base():
    print(isinstance(obj2,Foo))   #打印False
    print(isinstance(obj1,Base))   #打印True

    *区分:给一个参数,判断对象是不是由某一个指定类? type   --->type(obj) == Foo

              给一个参数,判断对象是不是由某一个指定类或其父类?isinstanace---->isinstance(obj,Foo)

    判断一个元素是函数还是方法:

    from types import MethodType,FunctionType
    def check(arg):
       if isinstance(arg,MethodType):
            print('方法')
       if isinstance(arg,FunctionType)
            print('函数')

    七.反射

    python面向对象中的反射,通过字符串的形式操作对象相关的属性.python中的一切事物皆是对象(都可以使用反射)

    四个可以实现自省的函数

    hasattr     

    getattr

    setattr

    delattr

  • 相关阅读:
    Eureka源码分析
    从零搭建一个SpringCloud项目之Sleuth+Zipkin(六)
    从零搭建一个SpringCloud项目之Config(五)
    spring-boot-lll-starter自动化框架介绍
    大数据量分批执行封装
    itext7史上最全实战总结
    springboot-lll-starter限流说明
    研究javax.validation.constraints.NotNull运行原理
    Nacos入门
    错误日志告警实战
  • 原文地址:https://www.cnblogs.com/liuqingyang/p/9549321.html
Copyright © 2011-2022 走看看