Python学习
一、面向对象
1. 类
1.1 概述
用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
1.2 语法格式
类名使用驼峰命名。
class ClassName:
<statement-1>
.
.
.
<statement-N>
示例:
class Person(object):
name = "zhangsan"
age = 20
def study(self):
print("I am studying...")
def getInfor(self):
print("%s 今年, %d 岁。" %(self.name,self.age))
# 实例化类
zs = Person()
zs.age = 30
print(zs.name)
print(zs.age)
zs.study()
zs.getInfor()
'''运行结果:
zhangsan
30
I am studying...
zhangsan今年,30岁。
'''
-注意:
python中,类的方法与普通的函数只有一个特别的区别:它们必须有一个额外的第一个参数名称,按照惯例它的名称是 self。self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类,self 不是 python 关键字。
1.3 __init__方法
类有一个名为 __init__()
的特殊方法(构造方法),该方法在类实例化时会自动调用:
def __init__(self):
self.data = []
类定义了 __init__()
方法,类的实例化操作会自动调用 __init__()
方法,对应的 __init__()
方法就会被调用:
__init__()
方法可以有参数,参数通过__init__()
传递到类的实例化操作上。
class Person(object):
# 定义基本属性
name = ""
age = 0
# 定义构造方法
def __init__(self,n,a):
self.name = n
self.age = a
def study(self):
print("I am studying...")
def getInfor(self):
print("%s 今年, %d 岁。" %(self.name,self.age))
# 实例化类
zs = Person("zhangsan",10)
print(zs.name)
print(zs.age)
zs.study()
zs.getInfor()
1.4 继承
Python支持多继承形式。
语法格式:
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
示例:
# 父类
class A:
def testA(self):
print("这是父类A的test方法")
class B:
def testB(self):
print("这是父类B的test方法")
# 子类
class C(A,B):
def myTest(self):
print("这是子类自己的方法")
c = C()
c.testA()
c.testB()
c.myTest()
# 运行结果
这是父类A的test方法
这是父类B的test方法
这是子类自己的方法
- 注意:
当多重继承中父类中存在同名的方法,那么此时,子类在调用时会调用哪个方法呢?
在python中,为了避免这种情况,使用MRO的方式进行方法的查找,即按照继承的顺序依次查找。如果子类中重写了该方法,就调用子类本身的,如果没有,就先查找A,找到了就调用,找不到就继续往下找,查找B,以此类推。如果最终都没有找到匹配的,就会报错。菱形继承是多重继承的典型问题,有兴趣可以去了解。在java中,可以通过接口或者内部类来实现这种类似多重继承的作用。
super()函数
class A:
def test(self):
print("这是A的test方法")
class B(A):
def test(self):
super().test()
print("这是B的test方法")
class C(B):
def myTest(self):
print("这是C的方法")
c = C()
c.test()
# 运行结果:
这是A的test方法
这是B的test方法
子类C如果重写了B中的test方法,就会首先调用子类自己的方法,如果没有,就调用父类B的方法,要想进一步调用A的test方法,只需要在A的子类B中使用super关键字。