Python之面向对象(1)
Python入门都在这了
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,继承的过程,就是从一般到特殊的过程。在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
继承概念的实现方式主要有2类:实现继承、接口继承。
在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。
OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。
python中类的继承分为:单继承和多继承
#定义父类
class ParentClass1:
pass
#定义父类
class ParentClass2:
pass
#单继承基类是ParentClass1派生类是SubClass
class SubClass1(ParentClass1):
pass
#python支持多继承,用逗号分隔开多个继承的类
class SubClass2(ParentClass1,ParentClass2):
pass
提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。
抽象即抽取类似或者说比较像的部分。是一种归类的方法。
继承:是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构。
抽象只是分析和设计的过程中,一个动作或者说一种技巧,通过抽象可以得到类。
在开发程序的过程中,当父类的方法实现不能满足子类需求时 可以对方法进行重写。 1.覆盖父类的方法 在子类中定义一个和父类同名的方法并且实现 2.对父类的方法进行扩展 在子类中重写父类的方法 在需要的位置使用 super().父类方法
注意: python2.0 中调用父类方法 父类名.方法(self) python 3.0 中仍然保留 但是不推荐使用 ,一旦父类发生变化 方法调用位置的类名也需要修改。开发过程中,父类名和super()两种方式不要混用,如果当前子类名调用方法会形成递归调用出现死循环。
class Parent: # 定义父类
def myMethod(self):
print
'调用父类方法'
class Child(Parent): # 定义子类
def myMethod(self):
print
'调用子类方法'
c = Child() # 子类实例
c.myMethod() # 子类调用重写方法
具体案例:
class Animal:
'''
人和狗都是动物,所以创造一个Animal基类
'''
def __init__(self, name,aggressivity,life_value):
self.name = name
self.aggressivity = aggressivity
self.life_value = life_value
def eat(self):
print('%s is eating'%self.name)
class Dog(Animal):
pass
class Person(Animal):
pass
egg = Person('Ahab',10,1000)
ha2 = Dog('天霸',50,1000)
egg.eat()
ha2.eat()
在python中继承中的一些特点:
如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。
派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后,如下所示:
class SubClassName (ParentClass1[,
ParentClass2, ...]):
...
私有属性和方法 2.0
class A:
def __init__(self):
self.num1=100
self.__num2=200
def __test(self):
print("私有方法%d%d"%(self.num1,
self.__num2))
class B(A):
def demo(self):
子类对象方法中不能访问父类私有属性方法
AttributeError: 'B' object has
no attribute '_B__num2'
print("访问父类私有属性%d"%self.__num2)
self.__test
#创建一个子类对象
b=B()
print(b)
<__main__.B object at 0x000000000266B1D0>
#在外界不能直接访问对象的
私有属性调用私有方法
#print(b.__num2)
<__main__.B object at 0x000000000266B1D0>
b.demo()
子类对象 不能在自己的方法内部直接访问父类的私有属性或私有方法 子类对象 可以通过父类的公有方法间接访问到 私有属性或 私有方法
继承有两种用途:
一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)
二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能
写在最后
今天只是简单的说了一下继承,继承的知识点非常多,后续会补充python的接口类和抽象类等相关知识,希望大家继续关注。