面向对象

类(Class):
用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。
对象是类的实例。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。 实例化:创建一个类的实例,类的具体对象。 
2 class 类名:
3     '类的文档字符串'
4     类体
5 '''
类的用法:
  • 实例化产生对象
  • 属性引用:数据属性;函数属性
class Chinese:

    country = ‘china’.    #数据属性

    def __init__(self,name,color,age):
        #初始化,但是一定不能有返回值
        if not isinstance(name,str):
            raise TypeError #挑起异常
        
        self.name = name
        self.color = color
        self.age = age
   def talk(self):        #函数属性
        print('talk')

    def eat(self):
        print('eat')

    def sleep(self):
        print('sleep')

p1 = Chinese('mona','pink',18) ===》 p1-对象

类的数据属性可以增删查改

对象的数据属性可以增删查改

对象本身并没有函数属性,但是可以访问类的--对象的绑定方法。对象里通用的数据和函数是引用类的名称空间

对象的属性,优先从自己的__dict__字典里找,如果自己的字典里没有,访问类里的,如果类里也没有,报错。自己定义的属性对其他引用了类的相同属性没有影响

实例化会做两件事:
1:先创建对象,赋值给p
2.把括号后的参数传给__init__执行初始化,__init__执行初始化时,会给对象创建名称空间。对象本身只有数据属性
属性调用:Chinese.name == Chinese.__dict__[‘country’]
 
类和对象名称空间:
    类的名称空间:定义时就产生名称空间
    对象的名称空间:实例化时产生对象的名称空间
 
继承:
继承是一种创建类的方式,遗传父类所有的属性
派生:衍生出新的属性
Super().talk   继承用父类的属性,并扩展
class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age 
        self.sex = sex
        
class Student(People):#继承People
    school = 'oldboy'
    #派生出新的属性
    def __init__(self,name,age,sex,group):
        super().__init__(name,age,sex) #内置函数super()
        # == People.__init__(self,name,age,sex) 调用类的函数
        self.group = group
        
t = Student('mona',18,'female',9)
在python3中,所有类默认继承object类
但凡继承了object的类都称为新式类(在python3中所有类都为新式类)
没有继承object的类都称为经典类
 
继承顺序:从下而上,从左至右
        新式类:广度优先
        经典类:深度优先
       Class.mro()查看类的继承循序
print(Student.mro())
#[<class '__main__.Student'>, <class '__main__.People'>, <class 'object'>]
 
继承:解决代码重用的问题,减少代码冗余
继承是类与类之间的关系,是一种什么是什么的关系
组合:是什么有什么的关系,也是为了减少重复代码
class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

class Student(People):#继承People
    school = 'oldboy'
    #派生出新的属性
    def __init__(self,name,age,sex,group,year,mon,day):
        super().__init__(name,age,sex) #内置函数super()
        # == People.__init__(self,name,age,sex) 调用类的函数
        self.group = group
        self.birth = Date(year,mon,day)  #组合Date类,创建self.birth

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

    def __str__(self):
        return '%s-%s-%s'%(self.year,self.mon,self.day)


t = Student('mona',18,'female',9,1993,3,25)
print(t.birth)     #1993-3-25
抽象类:
父类限制:
   子类必须要有父类的方法
    子类实现的方法必须跟父类的方法名字一样 
import abc
class File(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def read(self):
        pass
    def write(self):
        pass
class Txt(File):
    #read & write 这两个函数必须要有
    def read(self):
        pass
    def write(self):
        pass
    
t = Txt()
封装:
语法:__开头的属性,在定义阶段发生变形,__属性   ====> _类名__属性
_Self.__name  隐藏属性,用户无法直接访问该属性。另外提供接口供用户使用
@property  类装饰器  把被装饰的函数伪装成一个数据属性 
class People:
    def __init__(self,name,age,sex,weight,height):
        self.name = name
        self.age = age
        self.sex = sex
        self.__height = height
        self.__weight = weight
    @property
    def BMI(self):
        return self.__height/(self.__weight**2)

s = People('mona',18,'female',1.60,50)
print(s.BMI)

多态:同一种事物的不同形态

例如:同一类产生的不同的对象,对象可以共用该类的属性。即是多态

import abc
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def talk(self):
        pass
class People(Animal):
    def talk(self):
        print('say hello')
class Pig(Animal):
    def talk(self):
        print('哼哼哼')
class Dog(Animal):
    def talk(self):
        print('汪汪汪')
alex=People()
yuanhao=Pig()
wupeiqi=Dog()

# alex.talk()
# wupeiqi.talk()
# yuanhao.talk()

def talk(obj):
    obj.talk()

绑定方法:绑定给谁就是给谁用的

凡世在类中定义的函数(没有被任何装饰器修饰),都是绑定给对象的,即给对象用

特点:obj.bar()自动把obj当作第一个参数传入,因为bar()中的处理逻辑就是要处理obj
class People:
    def __init__(self,name):
        self.name = name
    def bar(self):
        print('--->',self.name)
绑定类的方法:
定义:在类中定义的,被classmethod装饰的函数是绑定到类的方法
特点:自动把类当作第一个参数传入
#seetings.py 文件内容:IP= 10.10.10.10 
#                    port = 8080

class Mysql:
    def __init__(self,ip,port):
        self.ip = ip
        self.port = port

    @classmethod
    def from_conf(cls):
        import settings #导入模块
        obj = cls(settings.ip,settings.port)
        return obj
    
s = Mysql.from_conf()
print(s.ip,s.port)
# 10.10.10.10   8080
非绑定方法:staticmethod
非绑定方法就是一个函数,不需要类,也不需要对象
class People:
    def __init__(self,name):
        self.name = name

    def bar(self):
        print('--->',self.name)

    @staticmethod
    def calculate(x,y):
        return x+y

s = People('mona')
print(s.calculate(2,8))   #10
面向对象的软件开发:
OOA::面向对象分析;
OOD:面向对象设计;
OOP:面向对象编程;
OOT:面向对象测试;
 OOSM :面向对象维护
反射:主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)
class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

s = People('mona',18,'female')
print(hasattr(s,'name'))         判断是否是对象或类的属性
print(getattr(s,'name'))         对属性取值
setattr(s,'group','group9')      添加或更改属性
print(getattr(s,'group'))
delattr(s,'group')              删除属性
print(s.__dict__)

'''True
mona
group9
{'name': 'mona', 'age': 18, 'sex': 'female'}'''

面向对象内置方法:如:__str__

class Student:
    school = 'oldboy'
    def __init__(self,name,age):
        self.name = name
        self.age = age

    # 控制打印对象名时显示的信息,必须有return 返回值
    def __str__(self):
        return self.name

    # 程序执行完后,对象已经在内存中清除完后,自动运行,一般写些关闭其他程序的操作
    def __del__(self):
        #做些与这个对象有关的清理操作
        print('===========>')

    #模拟与列表操作,查看值
    def __getitem__(self, item):
        return getattr(self,item)

    #修改
    def __setitem__(self, key, value):
        # setattr(self,key,value)
        self.__dict__[key] = value
    #删除
    def __delitem__(self, key):
        delattr(self,key)

 

 
posted @ 2017-06-29 20:03  皖心  阅读(166)  评论(0编辑  收藏  举报