一、方法的分类
要了解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:\PycharmProjects\pycharm_learn\venv\Scripts\python.exe D:/PycharmProjects/pycharm_learn/demo.py
<__main__.Person object at 0x00000240DBB73F10>
实例方法,编程--- <__main__.Person object at 0x00000240DBB73F10>
类方法,睡觉--- <class '__main__.Person'>
静态方法,走路---
Process finished with exit code 0
二、self到底是什么
以上代码在写的时候,self会自动填入进去,也就是说def xxx()这个时候pycharm会自动填入self,从运行结果也可以看到,print p和p.code里面的self是同一个内容,也就意味着实例方法,会将实例本身作为第一个默认参数传入方法。同理类方法也是,会将类对象传入第一个默认参数。也就是说,这里的self仅仅是一个形参,python习惯命名为self,你甚至可以修改为其他值,比如current_obj 综上,self就是实例方法的默认第一个参数的形式参数,也就是一个参数命名而已
三、不同方法的特点
1、第一个默认参数不同 类方法:类对象 实例方法:实例对象 静态方法:无第一个默认参数 2、实例,类,静态方法都是存放在类对象里面的 与属性不同,属性分为类属性和实例属性,分别存放在类和实例的__dict__键值对里。而方法都是存放在类中,代码体现 3、调用方式不同 后面补充,大原则是,不管怎么调用,要保证调用的方法是他们的类型需要的第一个参数
四、调用方法
1.代码示例
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("米饭")
Person.eat(123, "水果")
Person.eat(p, "水果")
func = Person.eat
func(p, "面条")
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)
未完待续
|