Python学习笔记 21

继承

  • 类的继承, issubclass( ) 方法
  • 方法的重写 , super( ) 方法
  • 多重继承 , 类名.__bases__ 方法

Tips:没有必要的话,多重继承尽量避免使用

class Animal :

	def run( self ) :
		print('动物会跑。')

	def sleep( self ) :
		print('动物睡觉。')

# 当前有一个类,能实现大部分功能,但实现不了全部功能
# 	创建一个新类让它继承这个类的属性和方法
# 	在定义类时,可以在括号内指定当前类的父类(又叫超类,基类,super)
# 		子类(衍生类)可以直接继承父类的属性和方法
# 通过继承可以避免重复编写代码,并且也符合OCP原则
# 所以我们经常通过继承对一个类进行扩展

class Dog(Animal) :
	
	def brak( self ) :
		print('狗叫。')

	# def run(self) :
	# 	print('bdog')

d = Dog()
d.run()
r = isinstance(d,Dog)
print(r)
r = isinstance(d,Animal)
print(r)

class Hashiqi(Dog):

	def sha(self) :
		print('我是哈士奇。')

print()

# 创建一个类时,如果省略了父类,则默认父类是object
# 	object是所有类的父类,所有类都继承自object

# issubclass(C,B) 检查C类是不是B类的子类
# isinstance(B,A) 检查对象B是不是A类的实例,如果A是其类的父类也会返回True
print( issubclass(Dog,Animal) )
print( issubclass(Hashiqi,Animal) )
print( issubclass(Animal,object) )

print( isinstance( d,Animal) )

方法重写和super( ):

# 如果在子类中有和父类同名的方法,则在调用时会调用子类中的方法
# 	这就是方法的重写(覆盖,override)

# 在调用方法时,会优先在当前类中去寻找,有则调用,
# 	没有就去它的父类中寻找,有则调用,没有就再去它的父类中寻找,
# 	以此类推,直到找到object类,如果没有就报错

class Animal :

	def run( self ) :
		print('动物会跑。')

	def sleep( self ) :
		print('动物睡觉。')

class Dog(Animal) :
	
	def brak( self ) :
		print('狗叫。')

	def run(self) :
		print('dog 跑。')

d = Dog()
d.run()
print(' -'*30)


# super( )
class Animal :

	def __init__ (self,name):
		self._name = name

	def run( self ) :
		print('动物会跑。')

	def sleep( self ) :
		print('动物睡觉。')

	@property
	def name(self):
		return self._name
	@name.setter
	def name(self,name):
		self._name = name

class Dog(Animal) :

	def __init__(self,name,age):
		# super( ) 可以用来获取当前类的父类,
		# 	并且通过super( ) 调用父类的方法是,不需要传递self
		super().__init__(name)
		self._age = age

	def brak( self ) :
		print('狗叫。')

	@property
	def age(self):
		return self._age
	@age.setter
	def age(self,age):
		self._age = age

d = Dog('小黑',3)
d.age = 4
print( d.name,d.age )

多重继承:

# Python中支持多重继承,即一个类可以有多个父类
# 多重继承会使子类同时拥有多个父类的方法
# 在开发时没有特殊情况,尽量避免使用多重继承,多重继承会使代码更复杂
# 如果多个父类中由同名方法,会从前向后查找,找到即调用
# 	所以前面的父类的优先级高

class A(object):

	def test1(self):
		print('AAA') 

class B(object):

	def test1(self):
		print('B中的test1') 

	def test2(self):
		print('BBB') 

class C(A,B):

	def test3(self):
		print('CCC') 

print(C.__bases__)# (<class '__main__.A'>, <class '__main__.B'>)
print(C.__base__)# <class '__main__.A'>
# 类名.__bases__ 可以用来获得当前类的所有父类
# 类名.__base__ 可以用来获得当前类的的第一个父类

c = C( )
c.test1()# 调用了A父类的test1方法,而没有调用B父类的test1方法

猜你喜欢

转载自blog.csdn.net/weixin_44011689/article/details/89790148
今日推荐