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、多继承:一个子类可以继承多个父类

posted @ 2021-03-11 22:26  搬砖小天使  阅读(101)  评论(0编辑  收藏  举报