Skip to content

十八、面向对象

1、类的创建

  1. 类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用

    python
    def __init__(self):
        self.data = []
  2. __init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上

  3. 类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的**第一个参数名称**, 按照惯例它的名称是 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)