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

    一、面向对象的编程

    和面向过程编程比较
    
    过程编程(思想):
    流水线式
    优点:逻辑清晰 (逻辑一步步的,系统)
    缺点:可扩展性差(上一个函数的输出结果是下一个函数的输入)
    
    面向对象编程(思想):
    pyhton中的一切皆对象
    对象的概念(特征和技能结合体)
    面向*对象*编程==定义出一个个鲜明的独特对象,然后通过对象之间的交互编程
    优点:扩展性非常强
    缺点:逻辑关系非常复杂
    
    

    二、定义类和对象

    以选课系统为例
    
    定义学生为对象
    	#姓名:A
        #学号:2222
        #学校:oldboy
        	#技能:选课
            
        #姓名:B
        #学号:2323
        #学校:oldboy
        	#技能:选课
    定义老师为对象
    	#姓名:tank
        #学校:oldboy
        	#技能:教书
        #姓名:nick
        #学校:oldboy
        	#技能:教书
            
    类:分类/类别
    按照学生和老师分类,一个是学生,一个是老师
    类的概念:一系列具有共同特征或技能的对象
    
            
    现实世界中,先有对象,再有类
    在python中,先有类,再有对象
    #以class类名(必须使用驼峰体)
    	#多个特征
        #多个技能
        
        
        
    # 造类
    def f1():  #函数定义阶段,只检测语法,不执行代码
        
    class OldBoyStudent :# 类的定义阶段,会运行代码(牢记)
        school = 'oldboy'
        addr = 'shanghai'
        
        def choose_course(self):
            print('is choosing course')
            
    lodboystudent_dict = OldBoyStudent.__dict__ 
    #双下划綫开头的方法会在某种情况下自动触发
    print(oldboystudent_dict['school'])
    	#oldboy
        
    oldboystudent_dict['choode_course'](111)
    	# is choosing_course
        
    
    #造对象(实例化对象)
    stu1 = OldBoyStudent()
    print(1,stu1.school)
    	# 1,oldboy
    1,stu1.choose_course()
    	# is choosing course
    stu2 = OldBoyStudent()
    print(2,stu2.school)
    	#2,oldboy
    stu3 = oldboystudent()
    print(3,stu3.school)
    	#3,oldboy
    

    三、定义对象独有的特征

    class  OldBoyStudent:  # 类的定义阶段,会先运行代码
    	school = 'oldboy'
    	count =0
    	
    	def __init__(self,id,name,age=15):
    		self.id =id
    		self.name = name
    		self.age = age
    		OldBoyStudent.count+=1
    		
    		def choose_course(self):
    			print('is choosing course')
    			
     @stu1 = OldBoyStudent(222,'瑞星')
    print (OldBoyStudent.__dict__)
    	# {'__module__': '__main__', 'school': 'oldboy', 'count': 1, '__init__': <function OldBoyStudent.__init__ at 0
    print(stu1.id,stu1.name,stu1.age)
    	#   222 ,瑞星, 15
    @stu2 =OldBoyStudent(666,'孙悟空',10)
    print(stu2.id,stu2.name,stu2.age)
    	#   666 孙悟空,10
    	
    @stu3 = OldBoyStudent(11232,'sda',121)
    
    print(OldBoyStudent.count)
    	#3
    

    四、属性查找顺序

    class OldBoyStudent:#类的定义阶段会运行代码
        school =‘oldboy'
        name ='xxx'
        
        def __init__(self,id,name,age=12):#self 是实例化对象,自传值
            self.id = id   #stu1.id = id
            
            # self.name =name #stu1.name =name
            
            self.age = age # stu1.age =age
            
        def choose_course(self):
            print('is choosing course')
            
    print(OldBoyStudent.__dict__)
    	#{'__module__': '__main__', 'school': 'oldboy', 'name': 'xxx', '__init__': <function OldBoyStudent.__init__ at 0x00000000029551E0>, 'choose_course': <function OldBoyStudent.choose_course at 0x0000000009E021E0>, '__dict__': <attribute '__dict__' of 'OldBoyStudent' objects>, '__weakref__': <attribute '__weakref__' of 'OldBoyStudent' objects>, '__doc__': None}
    
    stu1 = OldBoyStudent(222,'瑞星')  #每次实例化对象时候,都会自动调用.__init__方法
    print(stu1.name)
    	# XXX
    print(stu1.__dict__)
    	#{'id': 222, 'age': 15}
    stu2 = OldBoyStudent(666,'孙悟空',10)    
    print(stu2.__dict__)
    	# {'id': 666, 'age': 19}
    

    属性的查找顺序:先从对象本身查找,对象没有,会去类中查找,类中没有则报错

    五、类与对象的绑定方法

    class OldBoyStudent:
        school = 'oldboy'
        
        def __init__(self,id,name,age=10):  #self是实例化对象,自动传值
            self.id =id        #stu1.id =id
            self.name =name		#stu1.name =name	
            self.age = age		#stu1.age =age
            
        def choose_course(self):  #约定俗成为self
            print(id(self))
            print(self.school)
            print(self.id)
            self.id+=1
            
            print(f'{self.name} is choosing course)
                  
    stu1  =OldBoyStudent(222,'瑞星')
    stu1.choose_course()		# # self = <__main__.OldBoyStudent object at 0x000001C5EC999860>
           #35791368
    		#oldboy
    		#222
    		#瑞星 is choosing course       
                  
    print(stu1.id)
        # 223
    
                  
    #针对类而言:choose_course里的self 就是传的参数
    #针对对象而言:choose_course 里的self就是对象本身
    stu2.OldBoyStudent(666,’孙悟空‘,12)
    print(stu2.id)
    	# 666    鄙视667
    

    六类与数据类型

    class Foo:
        pass
    
    class OldBoyStudent:  # 类的定义阶段,会运行代码(牢记)
        # 1 / 0
        school = 'oldboy'
    
        def __init__(self, id, name, age=15):  # (******)  # aaa是实例化的对象,自动传值  # self=stu1  # self=stu2
            self.id = id  # stu1.id = id
            self.name = name  # stu1.name = name
            self.age = age  # stu1.age = age
    
        def choose_course(self,name):  # 约定俗成为self
            print(f'{self.name} is choosing course')
    
    stu1 = OldBoyStudent(222222, '朱瑞星')  # 每次实例化对象的时候都会自动调用__init__方法(排在第一位的)
    # OldBoyStudent.choose_course(stu1,'2222')
    # stu1.choose_course(3)
    朱瑞星 is choosing course
    
    stu2 = OldBoyStudent(666666, '孔悟空')
    孔悟空 is choosing course
    
    

    七:对象的高度整合

    class Animal
    	def __init__(self,attri,height,weight):
            self.attri =attri
            self.height=height
            self.weight =weight
        def jiao(self):
            print(self.attri,'开始叫了')
        def eat(self):
            print(self.attri,'开始吃发了')
    people =Animal ('人类',180,150)
    dog  = Animal('狗',100,50)
    
    people.eat()
    dog.jiao()
    
    #人类 开始吃饭了了
    #狗 开始叫了
    
  • 相关阅读:
    重排序
    线程的生命周期状态
    并发的有序性
    并发的可见性
    并发的原子性
    Java内存模型
    缓存一致性协议MESI
    lsof
    nmap
    elastcisearch简介
  • 原文地址:https://www.cnblogs.com/zhuyuanying123--/p/11047203.html
Copyright © 2011-2022 走看看