zoukankan      html  css  js  c++  java
  • python的简单实用二(封装/继承/多态)

    1、main函数的作用:入口函数,只有run当前文件的时候,才会执行;

    class Animal:
        def __init__(self, name: str = '', age: str = ''):
            self.name = name
            self.age = age
    
        def __str__(self):
            return self.name + self.age
    
    
    # main是个入口函数,只有当该Python脚本直接作为执行程序时才会执行;
    if __name__ == '__main__':
        dog = Animal('dog', '18')
        cat = Animal('cat', '3')
        print(dog)
        print(cat)

     2、类的属性的两种调用方式

    class Animal:
        # 类的属性,可以在类的外部调用
        location = 'beijing'
        def __init__(self, name: str = '', age=0):
            self.name = name
            self.age = age
    
    if __name__ == '__main__':
        # 类的属性的访问方式一:通过实例化对象访问
        dog = Animal('dog', 18)
        print(dog.location)
        # 方式二:通过类名直接访问
        print(Animal.location)

     3、实例属性的优先级是要高于类属性的

    class Animal:
        # 类的属性,可以在类的外部调用
        location = 'beijing'
        def __init__(self, name: str = '', age=0, location=''):
            self.name = name
            self.age = age
            self.location =location
    
    if __name__ == '__main__':
        # 实例属性的优先级是要高于类属性的 输出结果河北
        dog = Animal('dog', 18, '河北')
        print(dog.location)

     4、私有属性,不能被类的外部访问,只能在类的内部调用,类外部调用会报错:object has no attribute __location

    说明:私有属性存在的意义是为了安全性,有些属性是不允许每个人都访问的,但是通过类中的方法,也可以实现调用私有属性,使得调用变得简单,也保证了数据的一致性(示例是对象的私有属性,下面还有类的私有属性)

    # 私有属性:不能被外部访问的属性
    class Animal:
        def __init__(self, name, sex, location):
            self.name = name
            self.sex = sex
            # 我们将以__开头的变量称为私有变量,此时只能在类内部调用的
            self.__location = location
    
    
    if __name__ == '__main__':
        dog = Animal('dog', 3, 'beijing')
        print(dog.__location)
    
    #报错:AttributeError: 'Animal' object has no attribute '__location'

     5、对象的私有属性:接上一个问题,既然私有属性不能被外部访问,那我应该如何调用:通过类中的方法,将私有化属性的值返回return

    class Animal:
        def __init__(self, name, sex, location):
            self.name = name
            self.sex = sex
            # 我们将以__开头的变量称为私有变量,此时只能在类内部调用的
            self.__location = location
    
        # 通过方法,可以返回私有化属性的值
        def get_location(self):
            return self.__location
    
    if __name__ == '__main__':
        dog = Animal('dog', 3, 'beijing')
        print(dog.get_location())

     6、类中的属性的调用方式(原理略复杂,先记住,后期补充解释):

    干货补充之类属性和对象属性的区别(重点):

    1. 类方法需要使用@classmethod来标记为类方法,否则定义的还是实例方法
    2. 类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.__localtion 实际上相当于Animal.__localtion
    # 调用类的私有属性的方法
    class Animal:
        __location = 'beijing'
        def __init__(self, name, sex):
            self.name = name
            self.sex = sex
    
        @classmethod
        def get_location(cls, location):
            cls.__location = location
    
        @classmethod
        def get_location(cls):
            return cls.__location
    
    if __name__ == '__main__':
        dog = Animal('dog', 3)
        print(dog.get_location())

    下面将类的继承,那什么是继承?继承的优势是什么?我们怎么去继承父类?

    7、什么是继承(面向对象很重要的一个属性)?

    1、继承是程序设计的范式;

    2、抽象并建立对象模型;

    3、是不同对象相互调用的逻辑;

    以人为例,人是面向对象编程的一个抽象,他拥有姓名、性别、年龄等等的一系列属性,人在描述某一对象时并不够清晰,比如抽象老师、学生。老师和学生继承人这个继承。但是继承是有一个正确的继承判断,不能瞎攀关系。老师可以继承人类,但是书包继承人类就不符合逻辑了。。。

    8、继承的优势:

    1)不需要重头编写

    2)子类继承父类所有的功能和属性

    3)子类只需要写自己的属性和新功能就ok了

    示例代码:

    # 类的继承
    # 父类
    class Person:
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
    
    # 子类 要告诉别人你要继承的父亲是谁,要不然怎么继承你家的家产?
    class Student(Person):
        # score分数是新继承过来的 只需要接收一下新变量
        def __init__(self, name, gender, score):
            # super是用来初始化从父类调用过来的属性的
            super(Student, self).__init__(name, gender)
            self.score = score
    
    student = Student('xue', 'girl', 100)
    print(student.name)
    print(student.gender)
    print(student.score)

    9、类的第三个特性:多态;在子类继承父类的方法时,会首先查找自身的定义,如果自身有定义,则优先使用自己定义的函数;如果没有定义,则顺着继承链向上找。

    class Person:
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
    
        def who(self):
            return 'I am a Person,my name is {}'.format(self.name)
    
    # 子类 subject
    class Teacher(Person):
        # score分数是新继承过来的 只需要接收一下新变量
        def __init__(self, name, gender, subject):
            # super是用来初始化从父类调用过来的属性的
            super(Teacher, self).__init__(name, gender)
            self.subject = subject
    
        def who(self):
            return 'I am a Teacher,my name is {}'.format(self.name)
    
    # 子类2
    class Student(Person):
        # score分数是新继承过来的 只需要接收一下新变量
        def __init__(self, name, gender, subject):
            # super是用来初始化从父类调用过来的属性的
            super(Student, self).__init__(name, gender)
            self.subject = subject
    
        def who(self):
            return 'I am a Student,my name is {}'.format(self.name)
    
    
    
    teacher = Teacher('王老师', 'girl', '语文')
    student = Student('mingming', 'girl', '语文')
    print(teacher.who())  # I am a Teacher,my name is 王老师
    print(student.who())  # I am a Student,my name is mingming

    10、多继承:一个子类可以继承多个父类

  • 相关阅读:
    缓存概述
    进程Process
    MVC系统过滤器、自定义过滤器
    暂无,进程那篇深度不够
    SeasLog 与 monolog 日志系统的区别,SeasLog安装步骤
    阿里面试官:说一下从url输入到返回请求的过程,问的难度就是不一样!
    [技术分享]OSI七层模型详解
    Mysql引擎介绍及InnoDB逻辑存储结构
    Paypal 实现自动订阅
    PayPal 支付Checkout 收银台和 Subscription 订阅计划全过程分享
  • 原文地址:https://www.cnblogs.com/wangxuetest/p/14521012.html
Copyright © 2011-2022 走看看