• day24 类的初始化、绑定方法、继承


    今日内容
    1、初始化函数
    2、绑定方法与非绑定方法
    3、绑定方法的特殊之处
    4、类的继承
    一、初始化函数
    1、什么是初始化函数
    我们在使用类创建对象时,创建出来的对象都会拥有类中的属性和方法,但是每个对象的属性及方法又不完全相同,
    他们有都有自己的属性及方法,那么如何添加对象特有的属性及方法呢?这时就需要使用到类的初始化方法
    2、类属性及对象属性
    类属性说的是类的属性,其应该是所有对象所共有的属性
    对象属性是每个对象特有的属性,单独存储在对象的名称空间中

    3、初始化函数__init__()方法
    init时初始化的英文缩写,__init__方法用于存储对象自己的属性
    在使用类进行实例化对象时,__init__()函数就会执行
    执行__init__()函数必须传入一个参数,这个参数就是对象本身(self)
    __init__()函数没有返回值,其返回值只能是None
    二、绑定方法
    1、什么是绑定方法?
    绑定方法就是将类的方法与对象或类进行绑定

    2、绑定方法与普通函数的区别
    绑定方法的函数第一个形参一般是类或者对象本身,在使用类或者对象进行调用时可能不需要为这个参数进行传值,会默认将类或者对象传值给这个参数
    普通函数每个形参必须传入实参。

    3、类中的方法一共有几种 分别有什么特点?
    类中的方法一共有三种:
    类绑定方法:@classmethod
    在执行方法时,不管是类进行调用还是对象进行调用都不需要为第一个形参传值
    对象绑定方法:默认就是对象绑定方法
    在执行函数时,如果是类进行调用就是普通函数,需要对第一个形参传入参数,如果是对象调用,就不需要给第一个参数传入参数
    非绑定方法:@staticmethod
    在执行函数时,不管是类还是对象进行调用,有几个参数就需要传入几个值

    4、三种方法使用特点:
    如果方法需要类中的数据,则设置为类的绑定方法
    如果需要使用到对象中的数据,就设置为对象的绑定方法
    如果类及对象中的数据都不需要使用,则设置为非绑定方法

    5、举例:
    class Person:
                age = 10
                def __init__(self,name):
                    self.name = name
            
                def a(self):
                    print("我的名字是:%s"%self.name)
            
                @classmethod
                def b(cls):
                    print("这个是:%s"%cls.age)
            
                @staticmethod
                def c(name):
                    print("my name is %s" %name)
            
            p = Person("lee")
            p.a()
            Person.a(p)
            
            p.b()
            Person.b()
            
            p.c("li")
            Person("li")
    三、OOP的三大特性之继承
    1、什么是继承
    继承指的是一种关系,在现实中儿子可以继承父亲的基因等,在python中继承与现实中的继承基本相同
    但是,程序中的继承与现实中的继承又有些许不同,程序中继承表示的是类与类之间的关系
    并且python中子类会继承父类的全部属性及方法

    例如b类继承a类 b类可以直接使用a类中的属性和方法 a是父类(基类,超类) b是子类(派生类)

    好处:极大的提高了代码的复用性

    2、语法
    class Human:
                def __init__(self,name,age):
                    self.name = name
                    self.age = age
            
                def run(self):
                    print("%s is running"%self.name)
            
            class Student(Human):
                pass
            
            
            s = Student("lee",18)
            s.run()
    3、抽象与继承、object基类
    抽象:就是将子类中共同的属性及方法提取出来,再创建一个公共的父类,在让子类全部继承自公共父类。

    在编写程序时要先抽象再继承,这样在编写程序时就是产生一些与业务无关的类,但是这些类时必须的,是为了增加代码的复用性

    在python中所有的类都是有继承关系的类,如果在创建类时没有继承关系,那么系统会默认让此类继承自object类,
    所有的类都会直接或者间接的继承自object类
    class OldBoyPerson:
                school = "oldboy"
                def __init__(self,name,age):
                    self.name = name
                    self.age = age
            
                def say_hi(self):
                    print("hello i am %s" % self.name)
            
            class Teacher(OldBoyPerson):
                def teach(self):
                    print("正在教书......")
            
            
            class Student(OldBoyPerson):
                pass
            
            
            # 测试
            t = Teacher("owen",38)
            t.say_hi()
            t.teach()
            
            s = Student("歌王",20)
            s.say_hi()
    4、名称空间的访问顺序
    在使用类实例化对象时,对象属性及方法的访问顺序为:对象自己的名称空间 -> 自己所属类的名称空间 -> 类的父类的名称空间 -> 父类的父类的名称空间 -> .... -> object的名称空间

    5、派生与覆盖
    派生:子类中具有与父类不相同得方法时就叫做派生
    覆盖:
    在继承父类的属性或方法中,如果某些属性及方法不能满足使用的需求,那么就需要对父类的方法进行重写
    重写的方式是:在子类中定义一个与父类同名的函数,再重新写自己的方法
    但是在某些情况下时需要对父类的功能进行扩展,此时就需要完全继承父类的某个方法,再在这个方法的基础上增加新的功能
    此时就需要使用super()来继承父类方法的全部部分,并对其进行扩展
    实例:
    class Person:
                text = "321"
                def __init__(self,name,age,gender):
                    self.name = name
                    self.age = age
                    self.gender = gender
            
                def sleep(self):
                    print("人类 午睡 躺着睡!")
            
                def say_hi(self):
                    print("my name :%s my age :%s my gender: %s " % (self.name,self.age,self.gender),end="")
            
                
            class Student(Person):
                text = "123"
                def __init__(self,name,age,gender,number):
                    #======================================================================重点在这里
                    # 由于父类已经存在一个方法可以完成这个三参数的初始化
                    # 所以可以直接调用父类的初始化完成这部分的初始化工作
                    # 方法1:
                    # Person.__init__(self,name,age,gender) # 指名道姓的调用
            
                    # 方法2:  在py2中不支持
                    super().__init__(name,age,gender)
            
                    # 方法3: py2的写法
                    # super(Student, self).__init__(name,age,gender)
                    self.number = number
                    #======================================================================
            
                # 访问父类的属性
                def show_text(self):
                    print(self.text)
                    print(super().text)
            
                def say_hi(self):
                    super().say_hi()
                    print("my number: %s" %  self.number)
                    # print("my name :%s my age :%s my gender: %s my number: %s" % (self.name, self.age, self.gender,self.number))
            
            
            s = Student("jack",20,"man","007")
            s.say_hi()
            # s.show_text()
  • 相关阅读:
    转: wireshark过滤规则
    PHP开发
    转:python安装pycrypto
    How to use pycharm to debug scrapy projects
    VCForPython27.msi安装后, 还显示error: Unable to find vcvarsall.bat
    Dcgpofix
    Dsamain
    组托管服务帐户概述
    创建 PSO
    介绍 Active Directory 域服务 (AD DS) 虚拟化
  • 原文地址:https://www.cnblogs.com/lice-blog/p/10877918.html
Copyright © 2020-2023  润新知