由于对面向对象编程很长时间没有复习过,昨天写Dataloader的时候,有个方法没写好,原因是,类内方法调用的时候,需要调用有self的方法,但是我还没试下调用类外方法的事例。

1. self 关键字

代表实例自身:在Python类的方法中,self 是一个指向实例本身的引用。

访问实例属性和方法:使用 self 来访问类的属性和其他方法。

在定义方法时必须:在类的实例方法定义中,self 必须作为第一个参数,代表调用该方法的对象实例。

2. 类内方法

定义在类内部:这些方法定义在类的定义中。

访问方式:通过类的实例(使用 self)或者直接通过类名(对于静态方法和类方法)来访问。

可以访问类属性和方法:类内方法可以访问通过 self 的同一实例的其他方法和属性。

**自动传递 self**:当实例方法被调用时,实例本身自动作为第一个参数传递(即 self)。

3. 类外方法

定义在类外部:这些是独立的函数,定义在类定义之外,通常在全局作用域中。

全局作用域:类外方法通常在其定义的模块的全局作用域中有效,如果是在不同模块,则需要导入。

4. 方法和函数的调用

类内调用类外方法:类内的方法可以自由地调用全局作用域中的其他函数或其他类的方法。这不需要特别的语法或 self

传递参数:当调用任何函数或方法时,必须提供正确数量和类型的参数,除了实例方法自动接收的 self

创建实例来调用:如果需要调用另一个类的实例方法,通常需要先创建那个类的实例。

5. 参数问题

实例方法的特殊性:实例方法的定义需要一个 self 参数,但在调用时不需要显式传递这个参数。

遵循函数定义:调用任何函数或方法时,参数必须符合该函数或方法的定义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def b1():
print('可以调用类外的方法')
class A():
def a1(self):
self.__a2()
b1()
self.a3()
def __a2(self):
b1()
def a3():
b1()
aa = A()
aa.a1()

可以调用类外的方法
可以调用类外的方法
Traceback (most recent call last):
File "/Users/feng/Desktop/Dog/self-test/self_test.py", line 13, in <module>
aa.a1()
File "/Users/feng/Desktop/Dog/self-test/self_test.py", line 7, in a1
self.a3()
TypeError: a3() takes 0 positional arguments but 1 was given