- 一、方法的分类
- 二、self到底是什么
- 三、不同方法的特点
- 四、调用方法
- 1.代码示例
- 2.运行结果
- 3.总结
- 五、如何选择设计为什么方法
- 未完待续
要了解self到底是什么,就要从python的方法开始讲起了。python中的方法分为实例方法,类方法和静态方法
代码:
class Person:
def code(self):
print("实例方法,编程---", self)
@classmethod
def sleep(cls):
print("类方法,睡觉---", cls)
@staticmethod
def walk():
print("静态方法,走路---")
p = Person()
print(p)
# 实例方法,默认第一个参数必须是实例对象
p.code()
# 类方法,默认第一个参数必须是类对象
Person.sleep()
# 静态方法,没有默认参数
Person.walk()
运行结果
D:PycharmProjectspycharm_learnvenvscriptspython.exe D:/PycharmProjects/pycharm_learn/demo.py <__main__.Person object at 0x00000240DBB73F10> 实例方法,编程--- <__main__.Person object at 0x00000240DBB73F10> 类方法,睡觉---二、self到底是什么静态方法,走路--- Process finished with exit code 0
以上代码在写的时候,self会自动填入进去,也就是说def xxx()这个时候pycharm会自动填入self,从运行结果也可以看到,print p和p.code里面的self是同一个内容,也就意味着实例方法,会将实例本身作为第一个默认参数传入方法。同理类方法也是,会将类对象传入第一个默认参数。也就是说,这里的self仅仅是一个形参,python习惯命名为self,你甚至可以修改为其他值,比如current_obj
综上,self就是实例方法的默认第一个参数的形式参数,也就是一个参数命名而已
1、第一个默认参数不同
类方法:类对象
实例方法:实例对象
静态方法:无第一个默认参数
2、实例,类,静态方法都是存放在类对象里面的
与属性不同,属性分为类属性和实例属性,分别存放在类和实例的__dict__键值对里。而方法都是存放在类中,代码体现
3、调用方式不同
后面补充,大原则是,不管怎么调用,要保证调用的方法是他们的类型需要的第一个参数
class Person:
def eat(self, food):
print("实例方法,吃---", self, food)
@classmethod
def sleep(cls, time):
print("类方法,睡觉---", cls, time)
@staticmethod
def walk():
print("静态方法,走路---")
p = Person()
p.age = 18
# 标准调用
p.eat("米饭")
# 可以看到其实实例方法就是一个普通的方法,self也就是一个普通的参数仅此而已,可以直接类去调用
Person.eat(123, "水果")
# 如果传入一个实例,就和实例直接调用是一样的效果了
Person.eat(p, "水果")
# 其实方法都是放在类的__dict__里的,所以和类属性非常相似
func = Person.eat
func(p, "面条")
# 标准调用类方法,类方法上面classmethod是一个装饰器,装饰器的作用是给方法增加本身没有的功能。这个类方法装饰器的作用就是不管是谁调用,都会给
# 其对应的类作为第一个参数默认传入,且如果是子类,会给子类的类~~~下面两行都是标准调用类方法
p.sleep("一个小时")
Person.sleep("两个小时")
# 同样,可以得到方法本身再加以调用
func2=Person.sleep
func2("三个小时")
# 静态方法不传入任何默认参数,所以即可用类调用,也可以用对象调用
p.walk()
Person.walk()
2.运行结果
.
3.总结类方法和静态方法都可以用类或者实例对象调用,实例方法需要用实例对象调用。如果实例方法实在想用类调用,就要在调用的时候传入一个具体的对象
五、如何选择设计为什么方法既然方法有这么多,那到底什么时候用什么方法呢。我个人总结为:当这个方法是针对某个对象进行某种操作的时候,用实例方法;当这个方法与对象本身无关,可以在调用的时候处理任意某个对象时可以用类方法;当一个方法与类和对象都没有什么关系,但是又需要定义出来时,可以用静态方法
l = [1, 3, 2, 4, 5] # 实例方法,可以实例直接使用 l.sort() print(l) l = [1, 3, 2, 4, 5] # 类方法,类方法使用的时候需要传入一个对象 list.sort(l) print(l)未完待续



