方法
实例方法
实例方法定义的第一个默认参数为self,指向当前使用的实例
class A:
def func(self):
print('1')
- 类无法调用实例方法
A.func()
# TypeError: func() missing 1 required positional argument: 'self'
这是因为,第一个参数
self,会在实例调用时自动传,而类调用时,是没有值填充这个self参数的
- 实例方法提供的
self参数可以在实例方法中访问实例变量
class A:
def __init__(self):
self.a = 1
def func(self):
print(self.a) # 通过self形参,访问实例的变量
- 注意:加了self参数之后,避免了多个同类之间对象调用同一个函数时会混乱的情况,计算机是不会做选择的
a = A()
b = A()
a.func # <bound method A.func of <__main__.A object at 0x10a96e198>>
b.func # <bound method A.func of <__main__.A object at 0x10a96e2e8>>
# 多个实例之间实例方法的内存地址不同
类的方法
类中普通方法
直接在类里写的无任何参数方法
class A:
def func():
pass
A.func() # OK
a = A()
a.func() # TypeError: func() takes 0 positional arguments but 1 was given
实例访问:访问不到,没有接受实例作为第一个参数的
self指针类访问:访问没问题,但是这个函数访问不到任何类中变量,没啥意义
- 总结:类中普通方法,没啥用,和外面定义一个方法是一样的,只是调用起来感觉多了个类的前缀而已
类方法
使用@classmethod来定义属于类的一个方法函数,在类中提供访问类变量的方法
class A:
num = 1
def __init__(self):
self.num = 2
@classmethod
def func(cls):
print(cls.num)
类方法第一个参数必须是cls(可读性区分),类似self,用来接受当前调用方法的类或实例,可以通过cls指针指向当前类,用以获取类中的属性,在这个代码中cls就是类A
类方法支持实例和类访问
a.func()
1
A.func()
1
静态方法
定义静态方法使用:@staticmethod,静态方法不需要默认的任何参数,跟一般的普通函数类似
通过这样的定义方式,我们可以在多个实例彼此之间可以共享这个函数中的数据和内容,静态方法类似类的普通方法,但是更加严格规范,并且支持拥有函数自身的参数,不需要提供位置为cls、self这样的指针
class A:
@staticmethod
def func(a,b):
print(a+b)
a = A()
A.func(3, 3)
a.func(1, 2)
静态方法支持类和实例访问
实例和类对方法的访问权限
| 方法类型 | 类 | 实例 |
|---|---|---|
self 实例方法 | 无法访问 | √ |
| 类的普通方法 | √ | 无法访问 |
类的方法 @classmethod | √ | √ |
静态方法 @staticmethod | √ | √ |
方法访问变量的权限
| 方法类型 | 类变量 | 实例的变量 |
|---|---|---|
self 实例方法 | √ | √ |
| 类的普通方法 | 无法访问 | 无法访问 |
类的方法 @classmethod | √ | 无法访问 |
静态方法 @staticmethod | 无法访问 | 无法访问 |