Python面向对象中的函数

161 阅读2分钟

方法

实例方法

实例方法定义的第一个默认参数为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,静态方法不需要默认的任何参数,跟一般的普通函数类似

通过这样的定义方式,我们可以在多个实例彼此之间可以共享这个函数中的数据和内容,静态方法类似类的普通方法,但是更加严格规范,并且支持拥有函数自身的参数,不需要提供位置为clsself这样的指针

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无法访问无法访问