Skip to main content
Python从设计之初就是一门面向对象的语言,如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程。 现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。 拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。 对比现实对象和软件对象,它们之间十分相似。 软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。 :类是一个模板,它描述一类对象的行为和状态。 • 对象:对象是类的一个实例,有状态和行为。 例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。 通过上图创建一个简单的类来理解下 Python 中类的定义:
class Dog:

		# 构造方法
    def __init__(self, name, breed, colour, size):
        self.name = name
        self.colour = colour
        self.size = size
        self.breed = breed
    

    def eat(self):
        pass
 
    def bark(self):
        pass

    def run(self):
        pass

    def sleep(self):
        pass

构造函数

每个类都有构造方法。如果没有显式地为类定义构造方法,会继承自父类 Object 的构造(不能传递任何参数的构造)! 在创建一个对象的时候,都要调用构造方法来把对象初始化。构造方法的名称必须是__init__

创建对象

对象是根据类创建的。在Pytho中,使用关键字 类名()来创建一个新的对象。 创建对象需要以下三步:
  • 声明:声明一个对象,包括对象名称和对象类型。
  • 实例化:使用类名()来创建一个对象。
  • 初始化:创建对象时,会调用构造方法初始化对象。
创建一个对象的过程,也叫做这个类的实例化,此对象也叫做这个类的实例 比如我基于上诉的狗类,创建一个我的小狗
my_dog = Dog("旺财","哈士奇","灰色","中型犬" )

类成员

类有哪些构成呢,也就是有什么成员呢? 只有两种东西:属性和方法(含特殊的构造方法)。 按照所属,可以给属性和方法划分两大类,属于类本身的成员,还是给实例化后对象用的成员:类成员(也叫静态)和实例成员。 如下列子,我们定义了个手机类,然后我基于此类生产创建了个手机对象 my_phone ,并且调用打电话的方法,然后修改了手机类的版本,并答疑
class Phone:
    def __init__(self, name, color, brand):
        # 实例成员-属性
        self.name = name
        self.color = color
        self.brand = brand
    
    # 实例成员-方法
    def call(self):
        print(self.name+'开始打电话')
    
    # 类成员-属性
    version = '1.0.0'

    # 类成员-方法
    @classmethod
    def set_version(self,v):
        Phone.version = v

my_phone = Phone('我的手机', '红色', '华为')
my_phone.call()
print(my_phone.version)
Phone.set_version('2.0.0')
print(Phone.version)
有一点需要注意,对象可以访问类成员,但是类成员不能访问对象成员

继承

Python 支持类的继承,如果一种语言不支持继承,类就没有什么意义。
#类定义
class people:
    #定义构造方法
    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))
    def eat(self):
        print("%s 说: 我在吃饭"%(self.name))
 
#单继承示例
class student(people):
    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.eat() # 调用父类方法
s.speak()
print(type(s)) # 输出为 <class '__main__.student'>
print(isinstance(s, people))  # True
另外,python 支持多继承!class Xx(Base1, Base2)

访问控制

带有 __xx 的属性或方法,属于私有成员,外部不可直接访问
class people:
    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))
    def eat(self):
        print("%s 说: 我在吃饭"%(self.name))
 
p = people('张三',10,60)
print(p.name)  # 输出:张三
print(p.__weight)  # 报错:people' object has no attribute '__weight'