方法相关
方法的概念
描述一个目标的行为动作:比如描述一个人怎样吃,怎样喝,怎样玩…
和函数非常类似
- 都封装了一系列行为动作
- 都可以被调用的之后,执行一系列行为动作
- 最主要的区别就是:调用方式
方法的划分
-
实例方法(实例也就是对象,因为对象是类的实例化,当我们探索底层时,称“类对象”与“一般对象”,再接下来我们统称一般对象为“实例”,则对应属性即为类属性与实例属性)
默认第一个参数需要接收到一个实例
-
类方法
默认第一个参数需要接收到一个类
-
静态方法
第一个参数啥也不默认接收
注意:
- 划分的依据是:方法的第一个参数必须要接收的数据类型;
- 不管是哪一种类型的方法,都是存储在类当中;没有在实例当中的;
- 不同类型方法的调用方式不同,但,不管怎么调,把握一个原则
- 不管是自己传递,还是解释器帮我们处理;最终要保证不同类型的方法第一个参数接收到的数据,是他们想要的类型
实例方法+类方法+静态方法
实例方法与类方法不是存储层面的,而是方法的第一个参数必须要接收的数据类型而已。三种方法都是存储到类的dict中的。
实例方法
class Person:
# 实例方法
def eat2(self):
print(1)
print(2)
print(3)
def run(self,food):
print("在吃饭",food)
# self是形参,在调用中可被实参代替。
# 也可以加其他名字,不在乎形参名称,都会把实例对象本身传递给实例方法的第一个参数,self是规范写法。
p = Person()
p.run("土豆") # 第一个参数不用传递
# 在吃饭土豆
标准调用:使用实例调用实例方法;不用手动传,解释器会默认把调用对象本身传递过去。
注意:如果实例方法没有接受任何参数则会报错。def run(): # 无参数,调用会报错
其他调用:使用类调用;间接调用;本质就是直接找到函数本身来调用。
类方法
class Person:
# 类方法
@classmethod
def leifangfa(cls):
print("这是一个类方法",cls)
def leifangfa1(cls,a):
print("这是一个类方法",cls,a)
# 装饰器的作用:在保证原本函数不改变的前提下,直接给这个函数增加一些功能。
Person.leifangfa1(123)
p = Person()
p.leifangfa1(555)
func = Person.leifangfa1
func(111)
类调用:不用手动传递第一个参数,会自动的把调用的类本身给传递过去(直接写第二个参数即可)。
对象调用:不用手动传递第一个参数,会自动的把调用的对象对应的类给传递过去。
注意:一般使用类来调用。
关于@classmethod
静态方法
class Person:
# 静态方法
@staticmethod
def jingtaifangfa():
print("这是一个静态方法")
Person.jingtaifangfa()
p = Person()
p.jingtaifangfa
func = Person.jingtaifangfa
func()
类调用:直接调用就可以, 不需要考虑第一个参数。
对象调用:直接调用就可以。
注意:具体使用谁来调用,根据场景,哪个比较适合方便就使用哪个。
补充
要注意不同类型的方法访问不同类型的属性规律。
函数和方法的区别?
- 是否有宿主
- 函数都是独立的个体,函数之间几乎没有共享的数据
- 方法有宿主