Python基础第13讲 - 面向对象(3)
一、继承的简介
1、提高了代码的复用性
2、让类与类之间产生关系,有了这关系,才有了多态
继承是面向对象的三大特性之一:继承、多态、封装
isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()
issubclass() 检查一个类是不是另一个类的子类
object是所有类的父类,所有类都继承object
class Person:
name = ''
age = ''
class Doctor():
name = ''
age = ''
def study(self):
print('治疗病人')
class Soldie():
name = ''
age = ''
def study(self):
print('保卫国家')
class Animal:
def run(self):
print('动物跑...')
def sleep(self):
print('动物睡觉')
a = Animal()
a.run()
class Dog(Animal):
def home(self):
print('狗看家')
d = Dog()
print(d)
d.run()
d.sleep()
d.home()
print(isinstance(d,Dog))
print(isinstance(d,Animal))
class Person(object):
pass
print(issubclass(Dog,Animal))
print(issubclass(Dog,object))
print(issubclass(Animal,object))
print(issubclass(Person,object))
二、方法的重写
1. 如果在子类中有和父类重名的方法,通过子类的实例去调用方法时,会调用子类的方法而不是父类的方法,这个特点称之为方法的重写(覆盖 override)
2.当我们去调用一个对象的时候,会优先去当前对象寻找是否就有该方法,如果有直接调用,如果没有,则去当前对象的父类中去寻找,如果有直接调用父类中的方法,如果没有, 则去父类中的父类寻找,如果有直接调用,以此类推,指导找到object,如果依然没有就报错
'''
情况1
'''
class A(object):
def test(self):
print('A...')
class B(A):
def test(self):
print('B...')
class C(B):
pass
c = C()
c.test()
'''
情况2
'''
class A(object):
def test(self):
print('A...')
class B(A):
def test(self):
print('B...')
class C(B):
def test(self):
print('C...')
c = C()
c.test()
c.python()
三、super()
父类中所有的方法都会被子类继承,包括特殊方法,也可以重写特殊方法(initt)
super()可以用来获取当前类的父类,并且通过super()返回的对象,调用父类方法时不需要传递self
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().__init__(name)
self._age = age
def run(self):
print('狗跑了...')
def home(self):
print('狗看家')
@property
def age(self):
return self._age
@age.setter
def age(self,age):
self._age = age
d = Dog('二哈',20)
d.name = '德牧'
print(d.name,d.age)
四、多重继承
语法:类名.__bases__ :可以用来获取当前类的所有父类
在python中支持多重继承的,也就是我们可以为一个类同时指定多个父类
在开发中没有特殊情况,尽量避免使用多重继承,因为多重继承会让我们代码过于复杂,
如果多个父类中有同名的方法,则会在第一个父类中寻找,然后找第二个... 前边会覆盖后面的
class A(object):
def test(self):
print('A....')
class B(object):
def test(self):
print('B中的test方法')
def test2(self):
print('B....')
class C(B,A):
pass
print(A.__bases__)
print(B.__bases__)
print(C.__bases__)
c = C()
c.test()
c.test2()
五、多态:一个对象可以以不同的形态去呈现
面向对象的三大特征之一
多态字面上理解多种形态
熊(黑熊、棕熊、北极熊…)
class A:
def __init__(self,name):
self.name = name
@property
def name(self):
return self._name
@name.setter
def name(self,name):
self._name = name
class B:
def __init__(self,name):
self.name = name
@property
def name(self):
return self._name
@name.setter
def name(self,name):
self._name = name
class C:
pass
def speak(obj):
print('你好,%s'%obj.name)
def speak2(obj):
if isinstance(obj,A):
print('你好,%s'%obj.name)
a = A('葫芦娃')
b = B('钢铁侠')
c = C()
speak2(a)
结果: 你好,葫芦娃
刚才用len()函数来检查不同对象类型的长度其实就是面向对象的特征之一
之所有len()这个函数能获取长度,是因为这些对象中具有一个特殊方法__len__
换句话说只要对象中有__len__特殊方法,就可以通过len()方法来获取它的长度
面向对象的三大特征
封装 确保对象中的数据更安全
继承 保证了对象的可扩展性
多态 保证了程序的灵活性
六 类中的属性和方法
类属性
实例属性
类方法
实例方法
静态方法
class A(object):
count = 0
def __init__(self):
self.name = '葫芦娃'
def test(self):
print('我是test方法')
@classmethod
def test2(cls):
print('我是test2方法.........',cls)
print(cls.count)
@staticmethod
def test3():
print('我是test3方法........')
a = A()
a.count = 5
A.count = 8
print('A ',A.count)
print('a ',a.count)
print('a ',a.name)
a.test()
A.test(a)
A.test2()
a.test2()
A.test3()
a.test3()