1. 类
类是用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法。
1.1 类的定义
class ClassName:
......
1.2 类对象
类对象是类的实例。类对象支持两种操作:属性引用和实例化。
属性引用:类名.属性名
。
示例:
class MyCLass:
i = 0;
# 自定义方法
def f(self):
return "f()"
x = MyCLass(10)
print(x.i)
print(x.f())
1.3 构造方法
类有一个名为__init__()
的特殊方法(构造方法),该方法在类实例化时会自动调用。
示例:
class MyCLass:
i = 0;
# 构造方法
def __init__(self, i):
print("构造方法")
self.i = i
# 自定义方法
def f(self):
return "f()"
x = MyCLass(10)
print(x.i)
print(x.f())
输出:
构造方法
10
f()
self——self 代表类的实例,而非类
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是self
。示例:
class Test():
def g(self):
print(self)
print(self.__class__)
t = Test()
t.g()
输出:
<__main__.Test object at 0x7f31ac389e20>
<class '__main__.Test'>
从结果可以看出,self
代表的是类的实例,代表当前对象的地址,而self.class
则指向类。
self
不是 python 关键字,我们把他换成任何一个变量也是可以正常执行的,如下:
class Test():
# self不是python关键字,把它换成任何一个变量也可以正常执行
def h(para):
print(para)
print(para.__class__)
t = Test()
t.h()
输出:
<__main__.Test object at 0x7f31ac389e20>
<class '__main__.Test'>
1.4 类的属性与方法
在类的内部,使用 def
关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self
,且为第一个参数,self
代表的是类的实例。
class People:
# 基本(公有)属性
name = ''
age = 0
# 私有属性,类外部无法访问私有属性
__weight = 0
# 构造方法
def __init__(self, n, a, w):
self.name = n
self.age = a
self.__weight = w
# 类方法
def introduce(self):
print("我叫%s,今年%d岁。" %(self.name, self.age))
# 创建类实例
people = People("zhou", 24, 75)
# 调用类方法
people.introduce()
类的私有属性与方法
类的私有属性和方法:以两个下划线 __
开头,则声明该属性或方法为私有,只能在类的内部使用,如:__private_arrtibute
。
注:关于 Python 中下划线的使用可参考 Python 中下划线的含义。
示例:
"""
类的私有属性和方法:
以两个下划线开头,则声明该属性或方法为私有,只能在类的内部使用。
"""
class Player:
# 公有属性
name = ""
number = 0
# 私有属性
__age = 0
def __init__(self, name, number, age):
self.name = name
self.number = number
self.__age = age
# 私有方法
def __myAge(self, age):
self.__age = age
player = Player("kobe", 24, 41)
print(player.name)
print(player.number)
print(player.__age) # 报错,实例不能访问私有变量
player.__myAge(24) # 报错
2. 继承
Python 同样支持类的继承。子类的定义示例如下:
class DerivedClassName(BaseClassName):
<statement-1>
......
继承另一个模块的类,可以定义如下:
class DerivedClassName(modname.BaseClassName):
出现继承关系后:
- 子类(派生类
DerivedClassName
)会继承父类(基类BaseClassName
)的属性和方法。 - 可以在子类中重写父类的方法,添加额外的功能。
super()
函数是用于调用父类的一个方法。
示例:
# 定义一个父类
class People:
name = ''
age = 0
__weight = 0
def __init__(self, n, a, w):
self.name = n
self.age = a
self.__weight = w
def introduce(self):
print("我叫%s,今年%d岁。" %(self.name, self.age))
# 定义一个子类,继承People类
class Student(People):
grade = 0
def __init__(self, n, a, w, g):
# 调用父类的构造函数
People.__init__(self, n, a, w)
self.grade = g
# 重写父类的方法
def introduce(self):
print("我叫%s,今年%d岁,读%d年级" %(self.name, self.age, self.grade))
stu = Student("zhou", 24, 75, 3)
stu.introduce() # 子类对象调用重写的方法
super(Student, stu).introduce() # 用子类对象调用父类已被重写的方法
输出:
我叫zhou,今年24岁,读3年级
我叫zhou,今年24岁。