本文来自异想之旅公开发布的Python教程,原文地址:https://www.yuque.com/yxzl/python
一个简单的方法
在类的内部,使用 def
定义的函数称作类的方法。类的方法的第一个参数必须是self
。self
代表的是类的实例。
class Student:
name = ''
age = 10
def say_hello(self):
print('Hello')
a = Student()
a.say_hello() # 输出:Hello
self
详解
上例中的say_hello
虽然是一个方法,但是我们可以发现,无论这时候调用的是Student
类的哪一个对象,这个方法的执行结果都是完全相同的。
可通常情况下,我们希望对象的方法根据对象的属性去执行动作:比如我要实现一个say_name
方法,打印出对象的name
属性,这该怎么办?现在就需要用上self
了。
class Student:
name = ''
age = 10
def say_name(self):
print(self.name)
a = Student()
a.name = '小明'
a.say_name() # 输出:小明
a.name = '小刚'
a.say_name() # 输出:小刚
b = Student()
b.name = '小红'
b.say_name() # 输出:小红
现在对象属性的执行就和对象的属性产生了联系。
self
虽然被写在了方法函数定义的形式参数中,但是并不需要我们去为其赋值——Python 会自动将调用该方法的对象作为实际参数传给self
。同时,self
是被 Python 指定的关键字,不能按照我们的喜好去命名。
self
直接作为对象去使用即可,因此它也可以修改属性、调用方法,具体请见下面的示例:
class Student:
name = ''
age = 10
def say_hello(self):
print('Hello')
def say_name(self):
print(self.name)
def work(self):
self.say_hello()
self.name = '我的名字'
self.say_name()
a = Student()
a.work()
输出:
Hello
我的名字
在上例中,a.work()
等价于下面的代码:
a.say_hello()
a.name = '我的名字'
a.say_name()
需要传递参数的方法
class Student:
name = ''
age = 10
def set_age(self, new_age):
self.age = new_age
a = Student()
print(a.age) # 10
a.set_age(20)
print(a.age) # 20
对于更复杂的参数传递,实现和函数完全相同,这里不再赘述。只要注意形参列表中第一项为self
、实参正常传递的原则即可。
初始化方法 __init__
类在实例化时会调用 __init__
方法,完成一些类的初始化操作:
class Student:
name = ''
age = 10
def __init__(self):
print('对象初始化被执行')
a = Student() # 输出:对象初始化被执行
当然,如果仅仅是输出一句话,__init__
方法就有一些小题大做了。我们通常使用该方法为对象的一些属性进行初始的赋值操作:
class Student:
'''
由于我们在 __init__ 中定义了 name 和 age 两个属性,
因此此处的定义完全可以删去,
不会影响程序的运行和输出。
'''
name = ''
age = 10
def __init__(self, name=小明'', age=10):
self.name = name
self.age = age
a = Student()
print(a.name, a.age) # 小明 10
b = Student('小红', 20)
print(b.name, b.age) # 小红 20
你可以粗糙地理解为,在运行Student()
实例化对象时,就是调用了__init__
方法(虽然这句话并不正确)。
事实上,__init__
是魔术方法的一种。
魔术方法,Python 中所有以双下划线__
包起来的方法的统称。。这是一种的特殊方法,普通方法需要显式地调用,而魔术方法不需要调用,Python 会在特定事件执行且条件满足时自动执行。有关魔术方法的更多介绍,详见《类的方法(二)》。