方法的概念
描述一个目标的行为动作
和函数非常类似,最主要的区别为调用方式
class Person:
def eat2(self):
print(1)
print(2)
print(3)
p = Person()
p.eat2()
方法的划分
划分依据:
方法的第一个参数必须要接收的数据类型
不管是哪一种类型的方法,都必须存储在类当中,没有在实例当中
不同类型方法的调用方式不同,不管是自己传递,还是解释器帮我们处理,最终要保证不同类型的方法的第一个参数接收到的数据,是他们想要的类型
实例方法:默认的第一个参数需要接收到一个实例
类方法:默认的第一个参数需要接收到一个类
静态方法:第一个参数啥也不默认接收
class Person:
def eat2(self):
print('这是一个实例方法', self)
@classmethod
def leifangfa(cls):
print('这是一个类方法', cls)
@staticmethod
def jingtaifangfa():
print('这是一个静态方法')
p = Person()
print(p)
p.eat2()
Person.leifangfa()
Person.jingtaifangfa()
<main.Person object at 0x03AF60B0>
这是一个实例方法 <main.Person object at 0x03AF60B0>
这是一个类方法 <class ‘main.Person’>
这是一个静态方法
class Person:
def eat2(self):
print('这是一个实例方法', self)
@classmethod
def leifangfa(cls):
print('这是一个类方法', cls)
@staticmethod
def jingtaifangfa():
print('这是一个静态方法')
p = Person()
print(p.__dict__)
print(Person.__dict__)
{}
{‘module’: ‘main’, ‘eat2’: <function Person.eat2 at 0x04680660>, ‘leifangfa’: <classmethod object at 0x046A71F0>, ‘jingtaifangfa’: <staticmethod object at 0x046A7170>, ‘dict’: <attribute ‘dict’ of ‘Person’ objects>, ‘weakref’: <attribute ‘weakref’ of ‘Person’ objects>, ‘doc’: None}
实例方法
class Person:
def run(self):
pass
标准调用:
使用实例调用实例方法,不用手动传,解释器会自动把调用对象本身传递过来。
如果实例方法没有接收任何参数则会报错
class Person:
def eat(self, food):
print('在吃饭 ', food, self)
p = Person()
print(p)
p.eat('tudou')
使用类调用:
间接调用:
本质就是直接找到函数本身来调用
class Person:
def eat(self, food):
print('在吃饭 ', food, self)
Person.eat(123, 'abc')
func = Person.eat
func(999, 'abc')
类方法
class Person:
@classmethod
def leifangfa(cls, a):
print('这是一个类方法', cls, a)
Person.leifangfa(123)
p = Person()
p.leifangfa(666)
func = Person.leifangfa
func(111)
class A(Person):
pass
A.leifangfa(0)
这是一个类方法 <class ‘main.Person’> 123
这是一个类方法 <class ‘main.Person’> 666
这是一个类方法 <class ‘main.Person’> 111
这是一个类方法 <class ‘main.A’> 0
静态方法
class Person:
@staticmethod
def jingtaifangfa():
print('这是一个静态方法')
Person.jingtaifangfa()
p = Person()
p.jingtaifangfa()
func = Person.jingtaifangfa
func()
补充
class Person:
age = 0
def shilifangfa(self):
print(self)
print(self.age)
print(self.num)
@classmethod
def leifangfa(cls):
print(cls)
print(cls.age)
@staticmethod
def jingtaifangfa():
print(Person.age)
p = Person()
p.num = 10
p.shilifangfa()
p.leifangfa()
Person.leifangfa()