吾八哥学Python(十八):Python里的面向对象
在我们平时的编程中,面向对象是经常要使用到的一种技术,Python里也提供了面向对象的所有基本功能。在Python里的类支持多继承,支持覆盖类的任何方法,在类的某个方法里也可以调用基类里的同名方法。下面来看一些具体的实例学习!
类的定义
类的定义比较简单,具体如下:
class MyClass: id = 1 name = "名称" __tag = "这是类的私有属性" def testfunc(self): print(self.id) print(self.name) print(self.__tag)
需要注意的是如果是类的私有属性或方法则需要在属性名称前面加两个下划线,加了两个下划线的变量或者类的方法在子类和外部都是不能访问的。类的方法使用def关键字来定义,类的方法的第一个参数必须为self,在类的方法里访问类的属性的时候必须前面加self。
类的实例化
Python里类的构造函数为__init__,如果要在类构造的时候处理一些事情,例如初始化属性值,则可以重写__init__方法,类实例化的时候会自动调用__init__方法,__init__方法也支持参数的,看如下代码:
class MyClass: id = 1 name = "名称" __tag = "这是类的私有属性" def testfunc(self): print(self.id) print(self.name) print(self.__tag) def __init__(self, id, name): self.id = id self.name = name c = MyClass(123, "新的名称") c.testfunc()
类的继承
Python里的类是支持多重继承的,在多重继承的时候若是基类中有相同的方法名,而在子类使用时未指定,则Python会从左至右在基类中搜索是否包含方法。先看单继承的使用方法例子:
class MyClass: id = 1 name = "名称" __tag = "这是类的私有属性" def test(self): print(self.id) print(self.name) print(self.__tag) def __init__(self, id, name): self.id = id self.name = name #单继承的类ChildAClass class ChildAClass(MyClass): def __init__(self): self.name = "ChildAClass" #覆写父类方法 def test(self): #调用父类的test方法,也可以使用:super(ChildAClass, self).test() MyClass.test(self) print("调用testfunc") def funcA(self): print("测试funcA方法") c = ChildAClass() c.test() c.funcA()
以上代码执行结果为:
1 ChildAClass 这是类的私有属性 调用testfunc 测试funcA方法
再来看看多重继承的例子:
class MyClass: id = 1 name = "名称" __tag = "这是类的私有属性" def test(self): print(self.id) print(self.name) print(self.__tag) def __init__(self, id, name): self.id = id self.name = name #单继承的类ChildAClass class ChildAClass(MyClass): def __init__(self): self.name = "ChildAClass" #覆写父类方法 def test(self): #调用父类的test方法,也可以使用:super(ChildAClass, self).test() MyClass.test(self) print("调用testfunc") def funcA(self): print("测试funcA方法") class ChildBClass(MyClass): def funcB(self): print("测试funcB方法") class ChildXClass(ChildAClass, ChildBClass): def funcX(self): self.test() self.funcA() self.funcB() c = ChildXClass() c.funcX()
执行结果为:
1 ChildAClass 这是类的私有属性 调用testfunc 测试funcA方法 测试funcB方法
Python里的面向对象还支持运算符重载的,这个大家有兴趣的可以研究一下,这里就不写具体的例子了。面向对象给我们的编程带来了非常多的方便之处,如果没有其他语言的面向对象基础则应该找本书多看看概念相关的内容!
吾八哥学Python系列中间很长时间没更新了,要把学过的内容转化为文字记录下来,确实是需要花一定的时间来整理!可以说我很懒,也可以说我很忙!哈哈!后续会陆续补充更新......