python极简教程08:对象的方法

测试奇谭,BUG不见。

讲解之前,我先说说我的教程和网上其他教程的区别:

1 我分享的是我在工作中高频使用的场景,是精华内容;

2 我分享的是学习方法,亦或说,是指明你该学哪些、该重点掌握哪些内容;

3 基于1和2,你可以按照我的教程学,也可以网上找视频学,也可以看书学……你得明白,掌握学习方法比找学习资料重要得多。

这一场,主讲python的面向对象的第二部分——对象的方法

目的:掌握Python对象的五个核心方法。

init和new

讲解之前,先上一段代码

class Demo:
    def __init__(self, name):
        print("init")
        print("init " + name)

    def __new__(cls, *args, **kwargs):
        print("new")
        print("new " + args[0])
d = Demo("张三")

通过前面的学习,你能说出这段代码运行的输出结果吗?

答案是:

#new
#new 张三

通常,我们会认为__init__()是类的初始化方法,当实例化类之后,会优先执行它(运行后应当优先输出"init"、"init 张三"),但实际上,__new__()方法才优先执行的方法,同时,它也是创建对象的方法。

说得通俗一点:以造房子举例,new方法是打地基,存放建材原料,init方法则是按照图纸建造房子。

那么,什么时候用new方法?

其实,用得很少,更多的时候,我们使用的是init方法。但init方法用久了之后,就会误以为它是创建实例的方法,而实际上,new方法才是创建实例的方法。

大家谨记,以免面试时踩坑。

类方法、静态方法、对象方法

首先,先讲讲这三个方法如何使用。

  • 类方法:使用 @classmethod 装饰,第一个参数是cls
  • 静态方法:使用 @staticmethod 装饰
  • 对象方法:不使用装饰器,第一个参数是self
class Cat:

    age = 5
    area = 'Chengdu'

    def __init__(self, name):
        self.name = name

    # 这是一个有问题的方法
    def drink():
        print("Cat drink")

    # 这是一个静态方法
    @staticmethod
    def eat(food):
        print("Cat eat {}".format(food))

    # 这是一个对象方法
    def get_name(self):
        return self.name

    # 这是一个类方法
    @classmethod
    def info(cls):
        print(cls.age)
        print(cls.area)
        print(self.name)

# 实例化一只叫Kitty的黑猫 
black_cat = Cat('Kitty')

# 有问题的方法,直接报错了
# black_cat.drink() 

# 静态方法调用
black_cat.eat('fish') # 可以实例(black_cat)调用
Cat.eat('fish') # 也可以类(Cat)调用

# 类方法调用
black_cat.info() # 可以实例(black_cat)调用
Cat.info() # 也可以类(Cat)调用

# 对象方法调用
print(black_cat.get_name()) # 只能实例(black_cat)调用

到这里,你可能会问,这东西有啥用?

如果你只想写个脚本,执行一些简单的程序,那确实没啥用。你可以不关心这三个方法以及他们的调用,甚至连class类都不用写,直接def搞定。

但是,如果你想进阶,理解面向对象,它们很重要。

类方法

  • @classmethod 修饰,第一个参数是 cls
  • 方法作用:和实例无关,可以直接用 类名.方法名() 调用
  • 可能会需要用到类变量(注意:不是成员变量)
  • 可以类调用,也可以实例调用

静态方法

  • @staticmethod 修饰
  • 方法作用:和实例无关,可以直接用 类名.方法名() 调用,相当于一个类对外界提供的工具方法
  • 基本上不会用到类变量,用到类变量的话,只能硬编码调用类变量
  • 可以类调用,也可以实例调用

对象方法

  • 第一个参数是self
  • 实例的方法
  • 可以访问成员变量
  • 只能实例调用,不能类调用

一如既往,做个总结

01 我知道,对于初学者来说,面向对象,这个抽象的概念很难理解,但是,我没说,你一定要理解;

02 如果确实没有编码基础,先学会用,在用的过程中去理解,不更好吗?

posted @ 2022-01-18 16:24  程序员小谭  阅读(288)  评论(0编辑  收藏  举报