1 方法与函数区别
- 方法与函数主要区别:调用方式的不同
1. 函数 - 通过 “方法名()” 进行调用
2. 方法 - 通过 “目标.方法名” 进行调用
# 函数定义及调用
def eat():
print(1)
print(2)
eat()
# 类方法定义及调用
class Person:
def eat2(self):
print("11")
print("22")
p = Person()
p.eat2()
2 方法的划分
2.1 实例方法
- 默认第一个参数需要接收一个实例
2.2 类方法
- 默认第一个参数需要接收一个类
2.3 静态方法
- 第一个参数默认什么都不接收
参考例子(定义及调用)
class Person:
def eat2(self):
print("这是一个实例方法", self)
@classmethod
def leifangfa(cls):
print("这是一个类方法", cls)
@staticmethod
def jingtaifangfa():
print("这是一个静态方法")
p = Person()
print(p) # 结果 <__main__.Person object at 0x106c9e7f0>
p.eat2() #默认会将实例 p 传入方法 eat2 中, 结果:这是一个实例方法 <__main__.Person object at 0x106c9e7f0>
Person.eat2() # TypeError: eat2() missing 1 required positional argument: 'self'
Person.leifangfa() #默认会将 Person 类传入方法中,结果:这是一个类方法 <class '__main__.Person'>
p.leifangfa() #同样可以,结果:这是一个类方法 <class '__main__.Person'>
Person.jingtaifangfa() # 可以
p.jingtaifangfa() # 可以
- 方法存放位置都在类的 __dict__的属性字典内,实例中没有
print(p.__dict__)
print(Person.__dict__)
# 结果
{}
{'__module__': '__main__', 'eat2': <function Person.eat2 at 0x10a01abf8>, 'leifangfa': <classmethod object at 0x109fe2630>, 'jingtaifangfa': <staticmethod object at 0x109fe2710>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
2.4 注意
- 三种方法(实例方法、类方法、静态方法)划分的依据是:方法的第一个参数必须要接收的数据类型
- 不管是哪一种类型的方法,都是存在于类当中,没有在实例当中的
- 不同类型的方法调用方式不同,但一定要保证一个原则
不管是自己传递,还是解析器帮我们处理,最终要保证:不同类型的方法的第一个参数接收到类型的数据,是它们想要的类型
2.5 方法调用方式
- 实例方法
1. 标准调用
p.eat2()
2. 非标准调用
Person.eat2(p)
func = Person.eat2
func(p)
# 不传 self 参数的实例方式调用,此处没有声明为静态方法哦
class Person:
def eat2():
print("这是一个实例方法")
func = Person.eat2
func()
#下面调用方式则报错,通过实例调用就会默认传入实例作为第一个参数接收对象
p.eat2()
Person.eat2()
- 类方法
1. 标准调用
Person.leifangfa()
p.leifangfa() #这样调用为标准是文档告诉允许的,实际是也会默认将实例 p 的 class 作为第一个参数传入类方法中
2. 非标准调用
func = Person.leifangfa
func()
@classmethod 描述
@classmethod
静态方法
1. 标准调用
Person.jingtaifangfa() # 可以
p.jingtaifangfa() # 可以
2. 非标准调用
func = Person.jintai
func()
@staticmethod
2.6 三中方法内对两种属性的访问规则
- 实例方法
- 能直接访问实例属性
- 能直接访问实例对象对应 class 的类属性
- 类方法
- 能直接访问类属性
- 静态方法
- 一般不能访问类属性及实例属性
3 方法私有化
- 本质上与属性私有化一样,因为它们都是存放在__dict__内的
class Person:
__age = 18
def __run(self):
print("run")
#test
def _Person__run(self): #这样子定义会覆盖掉 run 方法
print("xxx")
p = Person()
p._Person__run() #xxx
print(Person.__dict__) #只有一个_Person__run键,实际值是 print("xxx")
网友评论