栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python面向对象——02.self到底是什么,原来你可以不叫self

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python面向对象——02.self到底是什么,原来你可以不叫self

python中的方法
  • 一、方法的分类
  • 二、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>
类方法,睡觉--- 
静态方法,走路---

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("米饭")
# 可以看到其实实例方法就是一个普通的方法,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)
未完待续
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/503936.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号