zoukankan      html  css  js  c++  java
  • 面向对象编程OOP

    面向对象特征:1、封装(对象具备行为能力写到方法里,便于重用和扩展,提高可维护性可扩展性)

    2、继承   3、多态

    class Book:#定义,Passic命名法,第一个字大写
        def __init__(self,title,price,author):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值
            self.title = title#当前这本书的标题是你传过来的标题
            self.price = price
            self.author = author
    
        def print_info(self):#加入一些行为
            print(self.title,self.price,self.author)
    
    
    #以上的类只是一个模板,并不代表具体哪本书
    #以下写入main方法
    if __name__ == '__main__':#实例化的过程
       book = Book('Python经典',price=20.0,author='Tom')
       book.print_info()

    在console下

    In[2]: import main
    In[3]: b = main.Book('Python')
    In[4]: b.price
    Out[4]: 0.0
    In[5]: b
    Out[5]: <main.Book at 0x25428181f98>

    想显示b具体的值 使用repr

    class Book:#定义,Passic命名法,第一个字大写
        def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值
            self.title = title#当前这本书的标题是你传过来的标题
            self.price = price
            self.author = author
    
        def __repr__(self):    #想返回具体信息
            return '<图书:{}>'.format(self.title)#自己定义
    
        def print_info(self):#加入一些行为
            print(self.title,self.price,self.author)
    
    
    #以上的类只是一个模板,并不代表具体哪本书
    #以下写入main方法
    #if __name__ == '__main__':#实例化的过程
    #   book = Book('Python经典',price=20.0,author='Tom')
     #  book.print_info()

    console

    In[6]: import importlib#再重新载入字符串
    In[8]: importlib.reload(main)
    Out[8]: <module 'main' from 'D:\PycharmProjects\main.py'>
    In[9]: b = main.Book('ASP.net')
    In[10]: b
    Out[10]: <图书:ASP.net>

     加入str

    class Book:#定义,Passic命名法,第一个字大写
        def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值
            self.title = title#当前这本书的标题是你传过来的标题
            self.price = price
            self.author = author
    
        def __repr__(self):    #想返回具体信息,调试的时候用
            return '<图书:{} at ox{}>'.format(self.title,id(self))#自己定义
        def __str__(self):#调用print呈现的结果,用str确定到底返回什么结果
            return '[图书:{},定价:{}]'.format(self.title,self.price)
    
        def print_info(self):#加入一些行为
            print(self.title,self.price,self.author)
    
    
    #以上的类只是一个模板,并不代表具体哪本书
    #以下写入main方法
    #if __name__ == '__main__':#实例化的过程
    #   book = Book('Python经典',price=20.0,author='Tom')
     #  book.print_info()

    console

    In[11]: importlib.reload(main)
    Out[11]: <module 'main' from 'D:\PycharmProjects\main.py'>
    In[12]: b = main.Book('c#')
    In[13]: b
    Out[13]: <图书:c# at ox2560473611736> #at是显示内存地址
    In[14]: print(b) #给普通用户看
    [图书:c#,定价:0.0]

     对象的理解

    应用count

    class Book:#定义,Passic命名法,第一个字大写
        count = 0 #计算书数量
        def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值
            self.title = title#当前这本书的标题是你传过来的标题
            self.price = price
            self.author = author
    
    
        def __repr__(self):    #想返回具体信息
            return '<图书:{} at ox{}>'.format(self.title,id(self))#自己定义
        def __str__(self):#调用print呈现的结果
            return '[图书:{},定价:{}]'.format(self.title,self.price)
    
        def print_info(self):#加入一些行为
            print(self.title,self.price,self.author)
    
    
    # 以上的类只是一个模板,并不代表具体哪本书
    # 以下写入main方法
    if __name__ == '__main__':#实例化的过程
      book = Book('Python经典',price=20.0,author='Tom')
      Book.count += 1 #第一本创建完这么写
      book2 = Book('Flask')
      Book.count += 1#用类取到,而不是实例取到
      book3 = Book('ASP.net')
      Book.count += 1
    
      print('图书数量:{}'.format(Book.count))#打印目前图书数量

    实现自己加1

    class Book:#定义,Passic命名法,第一个字大写
        count = 0 #计算书数量
        def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值
            self.title = title#当前这本书的标题是你传过来的标题
            self.price = price
            self.author = author
            Book.count += 1
    
    
        def __repr__(self):    #想返回具体信息
            return '<图书:{} at ox{}>'.format(self.title,id(self))#自己定义
        def __str__(self):#调用print呈现的结果
            return '[图书:{},定价:{}]'.format(self.title,self.price)
    
        def print_info(self):#加入一些行为
            print(self.title,self.price,self.author)
    
    
    # 以上的类只是一个模板,并不代表具体哪本书
    # 以下写入main方法
    if __name__ == '__main__':#实例化的过程
      book = Book('Python经典',price=20.0,author='Tom')
      book2 = Book('Flask')
      book3 = Book('ASP.net')
    
      print('图书数量:{}'.format(Book.count))#打印目前图书数量

    销毁一本书:del

    class Book:#定义,Passic命名法,第一个字大写
        count = 0 #计算书数量
    
        #初始化执行
        def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值
            self.title = title#当前这本书的标题是你传过来的标题
            self.price = price
            self.author = author
            Book.count += 1
         #删除对象执行
        def __del__(self):
            Book.count -= 1
    
        #控制台直接写对象执行
        def __repr__(self):    #想返回具体信息
            return '<图书:{} at ox{}>'.format(self.title,id(self))#自己定义
        #打印时执行
        def __str__(self):#调用print呈现的结果
            return '[图书:{},定价:{}]'.format(self.title,self.price)
    
        def print_info(self):#加入一些行为
            print(self.title,self.price,self.author)
    
    
    # 以上的类只是一个模板,并不代表具体哪本书
    # 以下写入main方法
    if __name__ == '__main__':#实例化的过程
      book = Book('Python经典',price=20.0,author='Tom')
      book2 = Book('Flask')
      book3 = Book('ASP.net')
    
      del (book3)
    
      print('图书数量:{}'.format(Book.count))#打印目前图书数量

    类函数,不加self的,跟实例无关,只是一个占位符

    class Book:#定义,Passic命名法,第一个字大写
        count = 0 #计算书数量
    
        #初始化执行
        def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值
            self.title = title#当前这本书的标题是你传过来的标题
            self.price = price
            self.author = author
            Book.count += 1
         #删除对象执行
        def __del__(self):
            Book.count -= 1
    
        #控制台直接写对象执行
        def __repr__(self):    #想返回具体信息
            return '<图书:{} at ox{}>'.format(self.title,id(self))#自己定义
        #打印时执行
        def __str__(self):#调用print呈现的结果
            return '[图书:{},定价:{}]'.format(self.title,self.price)
    
        def print_info(self):#加入一些行为
            print(self.title,self.price,self.author)
    
        def cls_method(cls):
            print('类函数')
    
    
    # 以上的类只是一个模板,并不代表具体哪本书
    # 以下写入main方法
    if __name__ == '__main__':#实例化的过程
      book = Book('Python经典',price=20.0,author='Tom')
      book2 = Book('Flask')
      book3 = Book('ASP.net')
    
      Book.cls_method(book2) #类函数与实例无关,括号里是获取信息
    class Book:#定义,Passic命名法,第一个字大写
        count = 0 #计算书数量
    
        #初始化执行
        def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值
            self.title = title#当前这本书的标题是你传过来的标题
            self.price = price
            self.author = author
            Book.count += 1
         #删除对象执行
        def __del__(self):
            Book.count -= 1
    
        #控制台直接写对象执行
        def __repr__(self):    #想返回具体信息
            return '<图书:{} at ox{}>'.format(self.title,id(self))#自己定义
        #打印时执行
        def __str__(self):#调用print呈现的结果
            return '[图书:{},定价:{}]'.format(self.title,self.price)
    
        def print_info(self):#加入一些行为
            print(self.title,self.price,self.author)
    
        def cls_method(cls):
            print('类函数')
    
        def static_method():#如果跟类无关括号里什么都不加就可以
            print('静态函数,逻辑上与实例无关')
    
    
    # 以上的类只是一个模板,并不代表具体哪本书
    # 以下写入main方法
    if __name__ == '__main__':#实例化的过程
      book = Book('Python经典',price=20.0,author='Tom')
      book2 = Book('Flask')
      book3 = Book('ASP.net')
    
      Book.cls_method(book2) #类函数与实例无关
      Book.static_method()
    class Book:#定义,Passic命名法,第一个字大写
        count = 0 #计算书数量
    
        #初始化执行
        def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值
            self.title = title#当前这本书的标题是你传过来的标题
            self.price = price
            self.author = author
            Book.count += 1
         #删除对象执行
        def __del__(self):
            Book.count -= 1
    
        #控制台直接写对象执行
        def __repr__(self):    #想返回具体信息
            return '<图书:{} at ox{}>'.format(self.title,id(self))#自己定义
        #打印时执行
        def __str__(self):#调用print呈现的结果
            return '[图书:{},定价:{}]'.format(self.title,self.price)
    
        def print_info(self):#加入一些行为
            print(self.title,self.price,self.author)
    
        def cls_method(cls):
            print('类函数')
    
        @staticmethod #和实例无关,一般不加
        def static_method(): #目标就是摆脱和实例的关系
            print('静态函数,逻辑上与实例无关')
    
    
    # 以上的类只是一个模板,并不代表具体哪本书
    # 以下写入main方法
    if __name__ == '__main__':#实例化的过程
      book = Book('Python经典',price=20.0,author='Tom')
      book2 = Book('Flask')
      book3 = Book('ASP.net')
    
      Book.cls_method(book2) #类函数与实例无关
      Book.static_method()
      book2.static_method()
    import datetime   运行不了
    
    class Student:
    
        def __init__(self,name,age,birthdate):
            self.name = name
            self.age = age
            self.birthdate=birthdate
    
    
    if __name__ == '__main__':
        s = Student('Tom',20,datetime.date(1992,3,1))
        print(s.age)
        print(s.birthdate)

    运行不了

    import datetime
    
    class Student:
    
        def __init__(self,name,birthdate):
            self.name = name
            #self.age = age
            self.birthdate=birthdat
    
        #想看年龄,传时没传,后来想看
        def get_age(self):
            return datetime.date.today().year - self.birthdate.year
    
    if __name__ == '__main__':
        s = Student('Tom',datetime.date(1992,3,1))
        #print(s.age)
        print(s.birthdate)
        print(s.get_age())
    @property#写个装饰器,表明属性
    import datetime
    
    class Student:
    
        def __init__(self,name,birthdate):
            self.name = name
            #self.age = age
            self.birthdate=birthdat
    
        @property#写个装饰器,表明属性
        def age(self):
            return datetime.date.today().year - self.birthdate.year
    
    
    if __name__ == '__main__':
        s = Student('Tom',datetime.date(1992,3,1))
        #print(s.age)
        print(s.birthdate)
        print(s.age)
        @property#写个装饰器,表明属性
        def age(self):
            return datetime.date.today().year - self.birthdate.year
    
        @age.setter
        def age(self,value):
            raise AttributeError('禁止赋值年龄!')
    
        @age.deleter
        def age(self): #删除
            raise AttributeError('年龄不能删除')

     特征:

    封装:对象具备行为写入函数,行为定义成方法写成类

    继承:两个类多个类之间有重叠的部分,有继承的关系,用代码实现

    多态:属于同一类型的不同实例,同一消息的不同响应能力

    属性:

    算面积

    import math
    
    class Circle:
        def __init__(self,radius): #
            self.radius = radius
    
    
        def get_area(self):#算面积
            return math.pi * self.radius ** 2
    
    c = Circle(4.0)
    
    print("圆的面积是:{}".format(c.get_area()))
    @property
    import math
    
    class Circle:
        def __init__(self,radius): #
            self.radius = radius
    
        @property#属性本质是个函数,但是用起来是个字段,加这个具备计算功能
        def area(self):
            return math.pi * self.radius ** 2 #取得math模块pi的自身r方
    
    
    
        # def get_area(self):#算面积
        #     return math.pi * self.radius ** 2
    
    c = Circle(4.0)
    
    print("圆的面积是:{}".format(c.area)) #像调一个字段

     类间的关系继承保护关系

    模拟公司内部员工工作场景

    继承

    class Employee:
        def __init__(self,department,name,birthdate,salary):
            self.department = department
            self.name = name
            self.birthdate = birthdate
            self.salary = salary
    
        def __repr__(self):#显示基本信息
            return '<员工:{}>'.format(self.name)
    
        def working(self):#工作行为
            print('员工:{},在工作...'.format(self.name)) #基类处理
    
        #子类处理
    
    class Programer(Employee):#直接继承,继承employee
        def __init__(self,department,name,birthdate,salary,specialty,project):
            super().__init__(department,name,birthdate,salary)#基类,调用init里,交给上面的代码完成
            self.specialty = specialty
            self.project = project
    
        def working(self):#重写,重载,体现多态特征
            print('程序员:{}在开发项目:{}...'.format(self.name,self.project))
    In[2]: import main
    In[3]: import datetime
    In[4]: import importlib
    In[5]: p = main.Programer('技术部','Peter',datetime.date(1990,3,1),8000,'Python','CRM')
    In[6]: p
    Out[6]: <员工:Peter>
    In[7]: p.salary
    Out[7]: 8000
    In[8]: p.specialty
    Out[8]: 'Python'
    In[9]: p.working()
    程序员:Peter在开发项目:CRM...
    import datetime
    
    class Employee:
        def __init__(self,department,name,birthdate,salary):
            self.department = department
            self.name = name
            self.birthdate = birthdate
            self.salary = salary
    
        def give_raise(self,percent,bonus=.0):
            self.salary = self.salary * (1 + percent + bonus)
    
        def __repr__(self):#显示基本信息
            return '<员工:{}>'.format(self.name)
    
        def working(self):#工作行为
            print('员工:{},在工作...'.format(self.name)) #基类处理
    
        #子类处理
    
    class Programer(Employee):#直接继承,继承employee
        def __init__(self,department,name,birthdate,salary,specialty,project):
            super().__init__(department,name,birthdate,salary)#基类,调用init里,交给上面的代码完成
            self.specialty = specialty
            self.project = project
    
        def working(self):#重写,重载,体现多态特征
            print('程序员:{}在开发项目:{}...'.format(self.name,self.project))
    
    if __name__ == '__main__':
        p = Programer('技术部','Peter',datetime.date(1990,3,3),8000,'Flask','CRM')
        print(p)
        print(p.department)
        print(p.salary)
        p.give_raise(.2,.1)
        print(p.salary)
    import datetime
    
    class Employee:
        def __init__(self,department,name,birthdate,salary):
            self.department = department
            self.name = name
            self.birthdate = birthdate
            self.salary = salary
    
        @property#定义属性
        def age(self):
            return datetime.date.today().year - self.birthdate.year #减自己员工生日
    
        def give_raise(self,percent,bonus=.0):
            self.salary = self.salary * (1 + percent + bonus)
    
        def __repr__(self):#显示基本信息
            return '<员工:{}>'.format(self.name)
    
        def working(self):#工作行为
            print('员工:{},在工作...'.format(self.name)) #基类处理
    
        #子类处理
    
    class Programer(Employee):#直接继承,继承employee
        def __init__(self,department,name,birthdate,salary,specialty,project):
            super().__init__(department,name,birthdate,salary)#基类,调用init里,交给上面的代码完成
            self.specialty = specialty
            self.project = project
    
        def working(self):#重写,重载,体现多态特征
            print('程序员:{}在开发项目:{}...'.format(self.name,self.project))
    
    if __name__ == '__main__':
        p = Programer('技术部','Peter',datetime.date(1990,3,3),8000,'Flask','CRM')
        print(p)
        print(p.department)
        print(p.salary)
        p.give_raise(.2,.1)
        print(p.salary)
        p.working()
    print(p.age)
    import datetime
    
    class Employee:
        def __init__(self,department,name,birthdate,salary):
            self.department = department
            self.name = name
            self.birthdate = birthdate
            self.salary = salary
    
        @property#定义属性
        def age(self):
            return datetime.date.today().year - self.birthdate.year #减自己员工生日
    
        def give_raise(self,percent,bonus=.0):
            self.salary = self.salary * (1 + percent + bonus)
    
        def __repr__(self):#显示基本信息
            return '<员工:{}>'.format(self.name)
    
        def working(self):#工作行为
            print('员工:{},在工作...'.format(self.name)) #基类处理
    
        #子类处理
    
    class Programer(Employee):#直接继承,继承employee
        def __init__(self,department,name,birthdate,salary,specialty,project):
            super().__init__(department,name,birthdate,salary)#基类,调用init里,交给上面的代码完成
            self.specialty = specialty
            self.project = project
    
        def working(self):#重写,重载,体现多态特征
            print('程序员:{}在开发项目:{}...'.format(self.name,self.project))
    
    class HR(Employee):
        def __init__(self,department,name,birthdate,salary,qualification_level=1):
            Employee.__init__(self,department,name,birthdate,salary)#调用init写
            self.qualification_level = qualification_level
    
    
        def working(self):
            print('人事:{}正在面试新员工'.format(self.name))
    
    
    if __name__ == '__main__':
        p = Programer('技术部','Peter',datetime.date(1990,3,3),8000,'Flask','CRM')
        print(p)
        print(p.department)
        print(p.salary)
        p.give_raise(.2,.1)
        print(p.salary)
        p.working()
        print(p.age)
    
    
        hr = HR('人事部','Marry',datetime.date(1992,4,4),6000,qualification_level=3)
        hr.give_raise(.1)
        print(hr.salary)
        hr.working()

    类间的关系

    把部门单独拿出写个类

    import datetime
    
    class Department:
        def __init__(self,department,phone,manager):
            self.department = department
            self.phone = phone
            self.manager = manager
    
    
    
    class Employee:
        def __init__(self,department:Department,name,birthdate,salary):#:depart员工接收上面depart信息
            self.department = department
            self.name = name
            self.birthdate = birthdate
            self.salary = salary
    
        @property#定义属性
        def age(self):
            return datetime.date.today().year - self.birthdate.year #减自己员工生日
    
        def give_raise(self,percent,bonus=.0):
            self.salary = self.salary * (1 + percent + bonus)
    
        def __repr__(self):#显示基本信息
            return '<员工:{}>'.format(self.name)
    
        def working(self):#工作行为
            print('员工:{},在工作...'.format(self.name)) #基类处理
    
        #子类处理
    
    class Programer(Employee):#直接继承,继承employee
        def __init__(self,department,name,birthdate,salary,specialty,project):
            super().__init__(department,name,birthdate,salary)#基类,调用init里,交给上面的代码完成
            self.specialty = specialty
            self.project = project
    
        def working(self):#重写,重载,体现多态特征
            print('程序员:{}在开发项目:{}...'.format(self.name,self.project))
    
    class HR(Employee):#派生类
        def __init__(self,department,name,birthdate,salary,qualification_level=1):
            Employee.__init__(self,department,name,birthdate,salary)#调用init写
            self.qualification_level = qualification_level
    
    
        def working(self):
            print('人事:{}正在面试新员工'.format(self.name))
    
    
    if __name__ == '__main__':
       dep = Department('技术部','01-87718391','张大三')#游离在内存外的单独实例
       p = Programer(dep,'Peter',datetime.date(1990,3,3),8000,'Python,Flask','XMall') #构造一个程序员
       p.give_raise(.2,.1)
       print(p.salary)

    显示

    import datetime
    
    class Department:
        def __init__(self,department,phone,manager):
            self.department = department
            self.phone = phone
            self.manager = manager
    
        def __repr__(self):
            return '<部门:{}>'.format(self.department)
    
    class Employee:
        def __init__(self,department:Department,name,birthdate,salary):#:depart员工接收上面depart信息
            self.department = department
            self.name = name
            self.birthdate = birthdate
            self.salary = salary
    
        @property#定义属性
        def age(self):
            return datetime.date.today().year - self.birthdate.year #减自己员工生日
    
        def give_raise(self,percent,bonus=.0):
            self.salary = self.salary * (1 + percent + bonus)
    
        def __repr__(self):#显示基本信息
            return '<员工:{}>'.format(self.name)
    
        def working(self):#工作行为
            print('员工:{},在工作...'.format(self.name)) #基类处理
    
        #子类处理
    
    class Programer(Employee):#直接继承,继承employee
        def __init__(self,department,name,birthdate,salary,specialty,project):
            super().__init__(department,name,birthdate,salary)#基类,调用init里,交给上面的代码完成
            self.specialty = specialty
            self.project = project
    
        def working(self):#重写,重载,体现多态特征
            print('程序员:{}在开发项目:{}...'.format(self.name,self.project))
    
    class HR(Employee):#派生类
        def __init__(self,department,name,birthdate,salary,qualification_level=1):
            Employee.__init__(self,department,name,birthdate,salary)#调用init写
            self.qualification_level = qualification_level
    
    
        def working(self):
            print('人事:{}正在面试新员工'.format(self.name))
    
    
    if __name__ == '__main__':
       dep = Department('技术部','01-87718391','张大三')#游离在内存外的单独实例
       p = Programer(dep,'Peter',datetime.date(1990,3,3),8000,'Python,Flask','XMall') #构造一个程序员
       p.give_raise(.2,.1)
       print(p.salary)
       print(p.department.department)
  • 相关阅读:
    php的源代码包构建一个空的php扩展。
    Web服务器上可能被包含或被请求的不同脚本源代码文件
    是否采用Sybase形式的自动字符串转义(用 '' 表示 ')
    数据库导入的大小是否要分段处理?
    Maven常用参数及其说明【转:http://blog.csdn.net/wangjunjun2008/article/details/18982089】
    bat常用命令,转【http://www.cnblogs.com/yplong/archive/2013/04/02/2996550.html】
    ftp链接、上传、下载、断开
    maven配置中国下载源【转:http://www.cnblogs.com/libingbin/p/5949483.html】
    经经经!!!!
    spring中quartz的使用。【转http://www.cnblogs.com/kay/archive/2007/11/02/947372.html】
  • 原文地址:https://www.cnblogs.com/shirleysu90/p/11986926.html
Copyright © 2011-2022 走看看