切换主题
十八、面向对象
1、类的创建
类有一个名为
__init__()
的特殊方法(构造方法
),该方法在类实例化时会自动调用pythondef __init__(self): self.data = []
__init__()
方法可以有参数,参数通过__init__()
传递到类的实例化操作上类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的**
第一个参数名称
**, 按照惯例它的名称是self
创建
python
#类定义
class people:
#定义基本属性
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
#定义构造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说: 我 %d 岁。" %(self.name,self.age))
# 实例化类
p = people('runoob',10,30)
p.speak()
2、继承
子类(派生类 DerivedClassName)会继承父类(基类 BaseClassName)的属性和方法。
python
class DerivedClassName(modname.BaseClassName):
示例:
python
#类定义
class people:
#定义基本属性
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
#定义构造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说: 我 %d 岁。" %(self.name,self.age))
#单继承示例
class student(people):
grade = ''
def __init__(self,n,a,w,g):
#调用父类的构函
people.__init__(self,n,a,w)
self.grade = g
#覆写父类的方法
def speak(self):
print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
s = student('ken',10,60,3)
s.speak()
3、多继承
Python同样有限的支持多继承形式。
python
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
...
<statement-N>
注:方法名同,默认调用的是在括号中参数位置排前父类的方法
4、重写
1、子类重写父类
python
class Parent: # 定义父类
def myMethod(self):
print ('调用父类方法')
class Child(Parent): # 定义子类
def myMethod(self):
print ('调用子类方法')
2、子类调用覆盖后的方法
python
c = Child() # 子类实例
c.myMethod() # 子类调用重写方法
3、子类调用父类被覆盖的方法
python
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法
5、属性与方法
__private_attrs
:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。
1、类的专有方法
方法 | 说明 |
---|---|
__init__ | 构造函数,在生成对象时调用 |
__del__ | 析构函数,释放对象时使用 |
__repr__ | 打印,转换 |
__setitem__ | 按照索引赋值 |
__getitem__ | 按照索引获取值 |
__len__ | 获得长度 |
__cmp__ | 比较运算 |
__call__ | 函数调用 |
__add__ | 加运算 |
__sub__ | 减运算 |
__mul__ | 乘运算 |
__truediv__ | 除运算 |
__mod__ | 求余运算 |
__pow__ | 乘方 |
2、运算符重载
Python同样支持运算符重载,我们可以对类的专有方法进行重载,实例如下:
python
class Vector:
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return 'Vector (%d, %d)' % (self.a, self.b)
def __add__(self,other):
return Vector(self.a + other.a, self.b + other.b)
v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)
以上代码执行结果如下所示:
python
Vector(7,8)