zoukankan      html  css  js  c++  java
  • 8.类的概念、定义、属性、继承

    1.面向对象(Object Oriented,OO)概念

    面向对象,是我们编程的一种思维。
    早期的计算机编程是基于面向过程的方法,例如实现算术运算1+1+2 = 4,通过设计一个算法就可以解决当时的问题。随着计算机技术的不断提高,计算机被用于解决越来越复杂的问题。通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承。通过面向对象的方法,更利于用人理解的方式,对复杂系统进行分析、设计与编程。同时也提高了系统的可维护性,可扩展性,可重用性。
    (就是使编程的思维,更接近与人的思维和认知)

    面向对象编程的关键,就是类的定义。
    类是对现实生活中一类具有共同特征的事物的抽象。

    2.类的定义

    基本形式:
        class ClassName(object):
            Statement
          
    1.class定义类的关键字
    2.ClassName类名,类名的每个单词的首字母大写(驼峰规则)。
    3.object是父类名,object是一切类的基类。在python3中如果继承类是基类可以省略不写。
    '''
    重点:学会定义类,了解属性和方法,类的初始化和实例化。
    定义类时,这种方法可以使类对象实例按某种特定的模式生产出来。
    '''
    #类方法:
    '''
    后面的参数中第一个参数我们约定俗成的为self参数名,
    self代表的是在类实例化后这个实例对象本身。
    
    初始化函数除了有self这个参数表示实例对象本身之外,
    其他的参数的定义也遵循函数的必备参数和默认参数一样的原则,
    必备参数就是在实例化是一定要传入的参数,
    默认参数就是在定义时可以给这个参数一个初始值。没有函数名的函数
    '''

    3.类的实例化

     基本形式:实例对象名 = 类名(参数)
    
        在实例化的过程中,self代表的就是这个实例对象自己。
    
        实例化时会把类名后面接的参数传进去赋值给实例,
        这样传进去的参数就成为了这个实例对象的属性。
    
        实例化的过程遵循函数调用的原则。
        在实例化时也必须个数和顺序与定义时相同(使用关键字参数可以改变传参的顺序)。
        当初始化函数定义时使用了默认参数时,在实例化时默认参数可以不传参这时
        这个实例对象就会使用默认的属性,如果传了参数进去则会改变这参数值,
        使实例化对象的属性就为你传进来的这个参数。
    
        isinstance(实例名,类名)
        判断一个实例是不是这个类的实例。
    #类   类是对现实生活中,具有共同特征的事物的抽象。
    
    class  Animal(object): 
        pass
    
    
    # object, 基类。 任何类都需要继承object
    
    # 类 (模子)
    class  Animal: #python3 继承object,可写可不写
        pass
    dog = Animal() #生成一个实例 dog
    cat = Animal() #生成实例cat
    
    
    
    ##构造方法 __init__() , self 参数
    class  Animal:
        def __init__(self):   # 构造方法,实例化对象时,必须要调用__init__
            print('正在实例化一个类')
    
        def test(self):
            print('aaa')
    
    #当我们没有写__init__() ,默认调用我们父类__init__
    class  Animal:
    
        def test(self):
            print('aaa')
    
    
    ###self, 实例化对象(本身)
    
    #self 可以替换成别的参数名。但是最好别改
    class TestSelf:     #方法 :testSelf 方法的首字母小写   类:  TestSelf 类的首字母一般大写 驼峰命名规则
        def __init__(self): #在初始化的时候,默认往构造方法,传入一个值
            print('正在实例化')
    
        def test(self):  
            print('bbb')
    
        def test2():
            print('ccc')

    4.类和实例的属性

     类属性
            .类属性是可以直接通过“类名.属性名”来访问和修改。
            .类属性是这个类的所有实例对象所共有的属性,
            任意一个实例对象都可以访问并修改这个属性(私有隐藏除外)。
            .对类属性的修改,遵循基本数据类型的特性:列表可以直接修改,字符串不可以,
            所以当类属性是一个列表时,通过任意一个实例对象对其进行修改。
            但字符串类型的类属性不能通过实例对象对其进行修改。
            当实例对不可变对象进行修改之后,会查找实例的类属性,不会查找类的属性,同时类的属性不会边
        
        实例属性
            .在属性前面加了self标识的属性为实例的属性。
            .在定义的时候用的self加属性名字的形式,在查看实例的属性时
            就是通过实例的名称+‘.’+属性名来访问实例属性。
        一些说明:
            .一般,方法第一个参数被命名为self,,这仅仅是一个约定,
            self没有特殊含义,程序员遵循这个约定。
            .查看类中的属性和实例属性可以调用__dict__方法返回属性组成的字典。
            .Python中属性的获取是按照从下到上的顺序来查找属性
            .Python中的类和实例是两个完全独立的对象
            .Python中的属性设置是针对对象本身进行的
    ####属性, 属性本质上就一个变量
    '''
    1.实例化属性
    2.类属性 (共有属性)
    '''
    
    
    # 1.实例化属性 , self.name
    class Animal:
        def __init__(self,name,food): #自己独有的,就放到实例化里面
            print('正在实例化')
            self.name = name # 实例化属性:每个实例可能不同,但是都有
            self.food = food
    
        def get_name(self):
            print(self.name)
    
    
    #2.类属性 (共有属性)
    
    class Animal:
        eye = 2
        leg = 4  #共有的
        def __init__(self,name,food):
            print('正在实例化')
            self.name = name
            self.food = food
    
        def get_name(self):
            print(self.name)

    5.类的私有属性和方法

        在Python中,通过单下划线”_”来实现模块级别的私有化,一般约定以单下划线”_”开头的变量、函数为模块私有的,也就是说”from moduleName import *”将不会引入以单下划线”_”开头的变量、函数
        对于Python中的类属性,可以通过双下划线”__”来实现一定程度的私有化。
        _”和” __”的使用 更多的是一种规范/约定,不没有真正达到限制的目的:
        “_”:以单下划线开头只能允许其本身与子类进行访问,(起到一个保护的作用)
        “__”:双下划线的表示的是私有类型的变量。这类属性在运行时属性名会加上单下划线和类名。
        “__foo__”:以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如 __init__()
    '''
    在Python中,通过单下划线”_”来实现模块级别的私有化,
    一般约定以单下划线”_”开头的变量、函数为模块私有的,
    也就是说”from moduleName import *”
    将不会引入以单下划线”_”开头的变量、函数
    '''
    import random   #全部会导入
     
    from random import*  #_Set  不会倒入
    
    class Animal:
        _eye = 2
        __leg = 4  #共有的
        def __init__(self,name,food):
            print('正在实例化')
            self.name = name
            self.food = food
    
        def get_name(self):
            print(self.name)
    
    #_”和” __”的使用 更多的是一种规范/约定,并没有真正达到限制的目的:
    
    dog._eye = 3
    #dog._Animal__leg ##__ 默认加一个类名,用来警告
    
    
    # “__foo__”:以双下划线开头和结尾的(__foo__)
    #代表python里特殊方法专用的标识,如 __init__()

    6.数据封装

    在类里面数据属性和行为函数的形式封装起来,
    访问时直接调用,不需知道类里面具体的实现方法。 比如,list.append

    7.继承

    用法:
        .在定义类时,可以从已有的类继承,
        被继承的类称为基类(父类),新定义的类称为派生类(子类)。
        
        .在类中找不到调用的属性时就搜索基类,
         如果基类是从别的类派生而来,这个规则会递归的应用上去。
         反过来不行。
        
        .如果派生类中的属性与基类属性重名,那么派生类的属性会覆盖掉基类的属性。
         包括初始化函数。
        
        .派生类在初始化函数中需要继承和修改初始化过程,
         使用’类名+__init__(arg)’来实现继承和私有特性,也可以使用super()函数。
        
        issubclass(类名1,类名2)
        判断类1是否继承了类2
        
    作用:
        面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。
        继承完全可以理解成类之间的类型和子类型关系。
        
        子类在重写父类方法之后,如果要继承父类方法中的功能,要先调用父类的方法  class.fun(self)

    8.多态

    当派生类重写了基类的方法时就实现了多态性。(子类重写父类方法)

    ## 面向对象   三个特征: 封装 ,继承  多态
    
    # 封装
    
    class Animal:
        eye = 2
        leg = 4  #共有的
        def __init__(self,name,food):
            print('正在实例化')
            self.name = name
            self.food = food
    
        def get_name(self):
            print(self.name)
    
        def get_food(self):
            print(self.food)
    
    
    # 继承
    #面向对象的编程带来的主要好处之一是代码的重用
    
    class People(Animal):
        leg = 2
        def __init__(self,name,food,sex):
            self.name = name
            self.food = food
            self.sex = sex
        
        def get_sex(self):
            print(self.sex)
    
        def speak(self):
            print('asdsdgfsagg')
    
        def eat(self):
            print('果子')
        
    
    
    #多态,   (子类重写父类方法) ,继承。 (同一个方法,有不同表形式)
    
    class Chinse(People):
        def speak(self):
            print('你好')
    
        def eat(self):
            print('米饭')
    
    
    class America(People):
        def speak(self):
            print('hello')
    
        def eat(self):
            print('面包')
        
    
    class Thai(People):
        def speak(self):
            print('萨瓦迪卡')
    
        def eat(self):
            print('香蕉')
    
    
    
    xiaoMing = Chinse('小明','米饭','')
    
    jeck = America('jeck','面包','')
    
    lala = Thai('lala','香蕉','未知')
    
    
    '''
    总结:
    1.类的定义
    2.__init__() 构造方法
    3.self  参数。 实例对象本身
    4.类属性 (共有属性),  实例化属性 
    5._  __   python 类的私有化。
    
    6. 面向对象  三大特征: 封装   继承   多态
    
    '''

    9.作业

    1.定义一个矩形的类:
    要求:1.有长和宽的属性
       2.有一个计算面积的方法

    class Rectangle:
        def __init__(self,length,width):     #构造方法
            if isinstance(length,(int,float)) and isinstance(width,(int,float)):
                self.length = length
                self.width = width
    
        def area(self):
            return self.length * self.width
    
    
    ##isinstance
    #如何判断self就是实例化对象
    
    ##class test(object):
    ##    def __init__(self):
    ##        if isinstance(self,test):  #True
    ##            print('老铁我真的是的')
    ##        else:
    ##            print('no')
    ##
    ##    def isin(self):
    ##        print(type(self))
    ##        print(type(test))             #元类  metaclass  
    ##        if type(self) == type(test):   #False
    ##            print('老铁我还是得')
    ##
    ##        else:
    ##            print('扎心了')
    View Code

    2.写一个正方形的类,继承矩形类

    要求:有一个判断是不是正方形的方法

    class Square(Rectangle):           
        def judgement(self):
            if self.length == self.
                return 'It is square'
            else:
                return 'It is not square'
    View Code
  • 相关阅读:
    disable_irq与disable_irq_nosync使用场景
    linux中断处理原理分析
    工作队列(workqueue) create_workqueue/schedule_work/queue_work
    使用git建立远程仓库,让别人git clone下来
    C中字符串的几种定义方法及说明
    Linux 2.6内核Makefile浅析
    探究platform_driver中的shutdown用途
    匆匆
    至强CPU性能排行,从X3210起,由低至高排列。
    Linux 命令行快捷键
  • 原文地址:https://www.cnblogs.com/woaixuexi9999/p/9215578.html
Copyright © 2011-2022 走看看