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、类中的属性的调用方式(原理略复杂,先记住,后期补充解释):
干货补充之类属性和对象属性的区别(重点):
- 类方法需要使用@classmethod来标记为类方法,否则定义的还是实例方法
- 类方法的第一个参数将传入类本身,通常将参数名命名为 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、多继承:一个子类可以继承多个父类