外观
类的方法(一)
一个简单的方法
在类的内部,使用 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() # 输出:小刚
现在对象属性的执行就和对象的属性产生了联系。
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:
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__
中定义了 name 和 age 两个属性,第2-3行的定义可以删去,不会影响程序的运行和输出。但是我们通常在实践中保留他们,这样可以提示我们这个类中定义过的属性,同时也易于让编辑器识别,进而提供更准确的类型提示。
事实上,__init__
是魔术方法的一种。
名词解释
魔术方法:名字被双下划线 __
包裹的方法的统称。这是一种的特殊方法,普通方法需要显式地调用,而魔术方法不需要调用,Python 会在特定事件执行且条件满足时自动执行。有关魔术方法的更多介绍,详见类的方法(二)。
版权所有
版权归属:异想之旅 | YuzhenQin