类的概述
类(Class)提供了一种将数据和函数捆绑到一起的方法,创建一个新的类代表创建了一个新的对象。每一个实例对象都拥有自己特有属性和继承的父类属性,用于表征自己此时此刻的状态。总所周知,状态是可能随时变化的,为此实例对象提供了一系列方法用于修改对象的状态信息。
作用域和命名空间
命名空间(namespace)是一种变量名映射到其对象的一种关系,目前主要是通过字典的形式得以实现。不同命名空间的变量名互不干扰,即使同名也是可以的(为了提高代码的可读性,还是建议以含义命名比较合适)。
==属性(attribute)==的访问是通过点号运算符实现的,如object.attribute
。属性可能是只读或者可写的。
作用域(scope)则是可以直接访问某个命名空间的一块代码区域。
Python中可以通过关键字global
和 nonlocal
来改变搜索变量名的命名空间。
类学习
初识类
类定义
class Classname:
statements...
class
关键字用于定义一个新的类,类的创建也就开辟了一个新的命名空间,内部的赋值过程都会被绑定到这个命名空间。
类属性
在类内部定义的变量名,都是类的属性,可以通过object.attribute访问属性,修改属性。__doc__
是内置的属性,用于查看类的文档字符串说明。
class Student:
"""
we define a new class,the name of class is Student
"""
number = 50
print(Student.number) #属性访问
Student.number = 100 # 属性修改
print(Student.__doc__)
print(Student.number)
类的实例化
实例化也即具体化,类是一类对象的抽象集合,而实例化则是抽象到具体的一个过程。好比,水果是一个类,而西瓜则是一个实例对象。类的实例化好比是一个无参函数的过程,当然他也可以传递参数,请看后续介绍。
Tom = Student() # 类Student的实例化
定制特定初始状态的实例
__init__
方法,在定义该方法后,创建实例过程会自动调用__init__方法。
class Student:
"""
we define a new class,the name of class is Student
"""
def __init__(self,age,sex):
# 参数self代表实例化对象,即Tom所指向的对象
# <__main__.Student object at 0x000002138CD98400>
self.age = age
self.sex = sex
number = 50
Tom = Student(20,'man') #自动调用__init__方法
print(Tom.age,Tom.sex)
类属性和实例属性
类属性是所有继承该类的实例对象所共有的,大家都可以访问。一旦改变所有实例对象和类属性都会一起改变;
实例属性是正对实例本身的属性,只能通过实例对象自己访问,修改。
实例对象无法修改类属性,类属性和实例属性同名时,实例属性会覆盖类属性
class Student:
"""
we define a new class,the name of class is Student
"""
def __init__(self, age, sex):
print(self)
self.age = age
self.sex = sex
number = 50
Tom = Student(20, 'boy')
John = Student(21, 'girl')
print(Tom.number, John.number) # 访问类属性
print(Tom.age, John.age) # 访问实例属性
Tom.grade = 98 # 实例Tom增加一个grade属性
print(Tom.grade)
try:
print(John.grade) # 只属于Tom实例对象
except AttributeError:
print("John has not this attribute.")
John.number = 100 # 实例对象无法修改类属性
print(Student.number, Tom.number, John.number) # 访问类属性
Student.number = 70
print(Student.number, Tom.number, John.number) # 访问类属性
del John.number # 解除属性引用
print(Student.number, Tom.number, John.number) # 访问类属性
类继承
在类名之后的括号内,列出所要继承的父类名称,该类会继承父类的属性和方法,如果存在同名的属性则会覆盖父类的属性,如果存在同名的方法,则重写了父类方法。
class Classname(BaseClassName):
statements
Python有两个内置函数用于检查继承关系,isinstance()
和issubclass()
,前者用于检查该实例的类型,后者用于检查是否是某类的子类。
多继承
class ClassName(Base1, Base2, Base3):
statements
属性搜索顺序按照深度优先,从左到右原则