首页 > 代码库 > day07面向对象进阶

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

 

day07面向对象进阶