Python函数的作用是将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需要调用其函数名即可。主要作用有:1.减少重复代码;2.方便修改,更易于扩展(加减功能);3.保持代码一致性(便于一修改一致修改) 。
Python函数为什么要加入self
在Python中,函数是对象,而对象是类的实例,类是一种抽象的数据类型,它定义了一组属性和方法,用于描述具有相同特征的对象,当我们创建一个类的实例时,实际上是在调用类的构造方法,在这个过程中,我们需要传递一些参数给构造方法,以便为实例设置初始值,这些参数通常被称为self
,它是指向实例本身的引用。
为什么我们要在函数中使用self
呢?这主要是因为self
参数允许我们在类的方法中访问和修改实例的属性,下面我们通过几个小标题来详细解释这个问题。
1. self
参数的作用
在Python中,每个对象都有一个名为__self__
的特殊属性,它表示该对象本身,这个属性并不是公开的,因此我们不能直接访问它,为了解决这个问题,Python引入了self
参数,它允许我们在类的方法中引用实例本身,这样,我们就可以在方法内部访问和修改实例的属性和方法。
假设我们有一个名为Person
的类,它有两个属性:name
和age
,我们可以在类中定义一个名为say_hello
的方法,用于打印实例的名字和年龄,代码如下:
class Person: def __init__(self, name, age): self.name = name self.age = age def say_hello(self): print(f"Hello, my name is {self.name} and I am {self.age} years old.")
在这个例子中,我们使用self.name
和self.age
来访问和修改实例的属性,如果我们不使用self
,而是直接使用变量名(如name
和age
),那么在方法内部就无法找到这些变量,这就是为什么我们需要在函数中使用self
的原因。
2. self
与实例属性的关系
在类的方法中,我们可以使用self
来引用和修改实例的属性,这意味着,当我们调用一个实例的方法时,实际上是在调用该实例的属性或方法,这种关系使得我们可以在不改变其他地方代码的情况下,轻松地为一个实例添加新的属性或方法。
我们可以为上面的Person
类添加一个新的属性gender
,用于表示实例的性别,代码如下:
class Person: def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender def say_hello(self): print(f"Hello, my name is {self.name} and I am {self.age} years old.")
在这个例子中,我们将gender
作为参数传递给__init__
方法,并将其赋值给实例的gender
属性,在say_hello
方法中,我们可以使用self.gender
来访问和修改这个属性,这就是为什么我们需要在函数中使用self
的原因。
3. self
与类属性的关系
除了实例属性之外,我们还可以在类的方法中访问和修改类的属性,这可以通过将类的属性作为参数传递给方法来实现,由于类属性是所有实例共享的,所以我们需要使用特殊的语法来访问它们,这种语法就是使用类名加上点号(.
)和属性名。
class Person: name = "John" age = 30 max_age = None @classmethod def update_max_age(cls): if cls.age > cls.max_age: cls.max_age = cls.age
在这个例子中,我们定义了一个名为update_max_age
的类方法,用于更新类的max_age
属性,这个方法通过访问类属性来获取当前的最大年龄,并将其与实例的年龄进行比较,如果实例的年龄大于最大年龄,那么就更新最大年龄,注意,我们在访问类属性时使用了类名(如cls.age
和cls.max_age
),这就是为什么我们需要在函数中使用self
的原因。
4. self.__class__
与子类化
在Python中,我们可以通过继承一个类来创建一个新的子类,子类可以继承父类的所有属性和方法,并可以添加自己的属性和方法,子类不能直接访问父类的私有属性(即名称以双下划线开头的属性),为了解决这个问题,Python提供了一个名为super()
的特殊函数,它可以用来调用父类的方法,我们还可以通过访问实例的__class__
属性来获取其所属的类,这个属性是一个指向类本身的引用,以下是一个示例:
class Animal: def __init__(self, name): self.name = name self.sound = None def make_sound(self): raise NotImplementedError("Subclasses should implement this method")
class Dog(Animal): def __init__(self, name): super().__init__(name) self.sound = "Woof!"
评论(0)