zoukankan      html  css  js  c++  java
  • day07面向对象进阶

    类.__init__查看对象的函数属性

    类.__dict__查看类的属性对象

    定义在类内部的变量,是所有对象共有的,id相同

    定义在类内部的函数,是绑定在所有对象上,给对象用的obj.func()就会吧obj传到func(obj)

    类内部的方法都是绑定方法,绑定到对象上

    绑定方法(类绑定,对象绑定),非绑定方法

    面向对象的特性

    类与对象

    对象是特征(变量)与技能(函数)的结合

    类是一系列对象共有的特征和技能

    现实中,先有对象,再总结归纳出类,程序中,先定义类再实例化对象

    类的第一种用法,实例化

    第二种用法,属性引用

    继承与多态

    继承

    “是”的关系,可以用继承来消除代码冗余

    人是动物,猪是动物,狗是动物

    类的括号写的是被继承的类

    继承顺序,在python2中有经典类和新式类,python3中只有新式类,新式类继承顺序

    新式类继承顺序:D->C->B->E->F->G->A

    继承可以是变量可以是方法,对象本身没有的变量或者方法去父类中找,父类没有去object中找。

    组合

    也可以解决代码容易,是什么“有”什么的关系

    class teacher:
        def __init__(self,name,age,year,mon,day):
            self.name = name
            self.age = age
            self.birth1 = birth(year,mon,day)

    class birth:
        def __init__(self,year,mon,day):
            self.year = year
            self.mon = mon
            self.day = day

        def tell(self):
            print("%s-%s-%s" %(self.year,self.mon,self.day))
    t=teacher("dodo",18,1990,8,12)
    print(t)#<__main__.teacher object at 0x00000000006C1DA0>
    print(t.name)#dodo
    print(t.birth1)#<__main__.birth object at 0x00000000006C1DD8>
    t.birth1.tell()#1990-8-12

    模拟接口

    在类里面定义需要实现的功能,在实例中实现

    class File():

    #     def read(self):#pass

    #     #方法一:主动抛异常,让实例实现read功能

    #         raise TypeError("类型错误")#主动抛异常,只有子类重写才不会抛异常

    #     #方法二:强行实现功能,抽象类

    抽象类

    import abc
    class File(metaclass = abc.ABCMeta):
        @abc.abstractmethod
        def read(self):  pass
       
    @abc.abstractmethod
        def talk(self):pass
    class
    word(File):
        def read(self):
            print("read")
        def talk(self):
            print("talk")

    p=word()#

    多态

    同一种事物的多种形态,类的子类。

    多态性:具有不同功能的函数可以使用相同的函数名

    如:父类的函数,在子类重写

    封装

    绑定方法和非绑定方法

    绑定方法:可以自动传值

    只要在类内部定义,没有任何修饰,就是对象的绑定方法,把对象当做第一个参数传入方法

    用@classmethod是类绑定方法,把类当做第一个参数传入方法体

    非绑定方法

    用@staticmethod修饰的类内部的方法就是非绑定方法,就是一个普通工具

    """
    绑定方法和非绑定方法
    """
    class Foo:
        def test1(self):
            pass
       
    @classmethod
        def test2(cls):
            pass
       
    @staticmethod
        def test3():
            pass

    p = Foo()
    print(p.test1)
    print(Foo.test2)
    print(p.test3)
    """
    <bound method Foo.test1 of <__main__.Foo object at 0x0000000000AB1D30>>
    <bound method Foo.test2 of <class '__main__.Foo'>>
    <function Foo.test3 at 0x0000000000AB3598>
    """

    反射

    通过字符串的方式寻找类中的属性

    class people:
        country = 'chinese'
       
    def __init__(self,name,age):
            self.name = name
            self.age = age
    p = people("egon",10)

    查询

    # print(hasattr(p,'name'))#类中有没有name属性

    增加
    # setattr(p,'x',123)#设置属性值
    # print(p.__dict__)#{'x': 123, 'age': 10, 'name': 'egon'}

    获取
    # print(getattr(p,'name'))#egon
    # print(getattr(p,'x',"not exist"))#not exist
    # #
    或者
    # if hasattr(p,'x'):
    #     res = getattr(p,'x')
    #     print(res)
    删除
    print(people.__dict__)#country
    print(p.country)
    delattr(people,'country')
    print(people.__dict__)#country

  • 相关阅读:
    Js实现页面处理器
    自定类型转换
    为什么PHP5中保存cookie以后,要刷新一次才能读取cookie的内容?
    PHP不不支持函数重载
    JS 省市区三级联动
    我喜欢的酷站
    网站宽度设置多少
    Windows环境下Node.js 以及NPM和CoffeeScript的安装配置
    HTML中Meta详解
    搭建SVN
  • 原文地址:https://www.cnblogs.com/doudouzheng/p/7031443.html
Copyright © 2011-2022 走看看