python类的继承
面向对象三大特征:封装、继承、多态
面向对象编程 (OOP) 语言的一个主要功能就是“继承”,所谓继承就是使现有的类无需编码便可以拥有原有类的方法和属性。
被继承的类可以称之为父类、基类、超类。继承的类可以称之为子类、派生类。派生和继承是一体面,从父类向子类看就是派生,从子类向父类看就是继承。子类和父类的关系可以用“is a”类表示,即子类是父类的一种,是一个更具体、更加强大的父类。python支持单继承和多继承。
继承的优点:
- 可以简化代码,减少冗余度
- 提高了代码的可维护性
- 提高了代码的安全性
单继承
所谓的单继承就是一个子类只有一个父类。子类会继承父类所有的属性和方法。
- 私有成员在子类中无法直接使用
- 子类对象无法直接使用继承自父类的私有成员
- 子类方法和父类方法重名,通过子类对象调用的是子类方法
class Animal:
def __init__(self,name,age):
self.name = name
self.__age =age
class Dog(Animal):
def __init__(self,name,age,gender):
#调用父类构造方法的好处,简化子类构造方法代码,实现了代码复用
#1. super(当前类名,self).__init__(实参列表) #实参不要带self
# super(Dog,self).__init__(name,age)
# 2. super().__init__(实参列表)#实参不要带self
super().__init__(name, age)
#3. ⽗父类名.__init__(self,其它参数)
# Animal.__init__(self,name,age)
self.gender = gender
类成员包括:类属性和类方法,不同于成员属性和成员方法属于对象,***类属性和类方法属于类,可以不实例化对象,直接通过类名调用,***这些类成员为所有对象共有,一般用于对象间通信。
- 在程序运行期间类属性始终存在
- 类属性
类方法和静态方法 - 类方法属于类,为所有对象共有,可以通过类名或对象调用
- 类方法可以用来访问类属性
- 静态方法属于类的作用域内的全局函数
- 类方法和静态方法的区别,类方法第一个参数是类对象,由系统传入,静态方法没有
- 共同点:静态方法和类方法都可以通过类名直接调用,属于类,不属于对象
class Date:
def init(self,year,month,day):
self.year = year
self.month = month
self.day = day
@classmethod #类方法
def date_from_string(cls,date_string):
'''
:功能:根据传入字符串创建日期对象
:param cls 类对象,和类名作用一样
:param date_string: 日期字符串,格式必须是yyyy-mm-dd
:return: 日期对象
'''
year,month,day = tuple(map(int,date_string.split('-')))
return cls(year,month,day)
@staticmethod
def is_valid_date(date_string):
year,month,day = tuple(map(int,date_string.split('-')))
return year >= 0 and 1 < month <= 12 and 0< day <=31
if __name__ =="__main__":
d1 = Date.date_from_string('2018-05-29')
print(d1.year,d1.month,d1.day)
print(Date.is_valid_date('2018-5-29'))
多继承
一个子类可以有多个父类。语法:
class 子类名(父类1,父类2....):
子类体
**print(子类名.__mro__)**可以看继承顺序。继承虽然代码减少了,但是想要增加需求时,方法的改写需要长时间的培养。故不建议经常使用。