Python系列:面向对象“类”之类成员

举报
数据分析与统计学之美 发表于 2021/09/27 21:53:03 2021/09/27
1.8k+ 0 0
【摘要】 python系列第十八课

今天就带着大家开始我们——Python学习的第十八课,Python基础之类成员(3)。
image.png

这一节,我想带着大家学习以下知识:

  • 类属性与实例属性;
  • 类方法与实例方法;
  • 静态方法;

1. 类属性与实例属性

1.1 类属性与实例属性的区别

① 属性的绑定不同
  • 类属性与当前类相关(绑定的是当前类),与当前类创建的任何对象无关;
  • 实例属性与当前对象相关(绑定的是当前对象);
② 访问方式不同
  • 对于类属性,可以通过类名,进行访问,也可以通过对象进行访问。但是,通过对象进行访问,属于“只读访问”,我们不能对其进行修改;
  • 对于实例属性,只能通过创建的对象,进行访问,不能通过类名进行访问;

1.2 什么时候定义类属性?什么时候定义实例属性呢?

① 定义类属性

不同对象都一致(完全一样)的属性,定义为"类属性",被大家共享。像desc = “人的描述”,只有一个。

② 定义实例属性

不同对象都不一样的属性,定义为"实例属性",被个人独享。像name,age,不同对象一般是不同的。

再次提醒:实例属性定义在init方法中,是不同对象所独享;类属性定义在类中,能被不同对象共享。

下面来看一个案例:

class Person:
    # 类属性
    desc = "人的描述"
    def __init__(self,name,age):
        # 实例属性
        self.name = name
        self.age = age
        
p = Person("黄同学",26)

1.3 访问类属性

强烈建议,类属性总是通过类名去访问。

① 通过类名,访问类属性(通过类名可以修改类属性)

在这里插入图片描述

通过类名修改类属性,可以修改成功

在这里插入图片描述

② 通过对象,访问类属性(只能是只读模式访问,不能通过对象修改类属性)

在这里插入图片描述

通过对象修改类属性,修改时不会报错,但是并没有真正修改成功。

在这里插入图片描述
通过对象修改类属性,其实并不是修改类属性,而是动态地给对象p增加了一个属性desc,只不过这个属性名desc,和类属性desc,具有相同的名称而已。

1.4 访问实例属性

实例属性只能够通过,创建的对象,进行访问。

class Person:
    # 类属性
    desc = "人的描述"
    def __init__(self,name,age):
        # 实例属性
        self.name = name
        self.age = age
        
p = Person("黄同学",26)
① 通过对象,访问实例属性

在这里插入图片描述

② 通过类名,访问实例属性,会报错

在这里插入图片描述

1.5 类属性与实例属性 知识总结

实例属性: 实例属性是对象独享的,每个对象都有自己的实例属性,彼此之间不受干扰。某个对象改变了自身的实例属性,对其他对象不会造成影响。

类属性: 类属性为类所有。由所有对象所共享(不属于任何对象)。一旦类属性发生了改变,会影响到所有对象。

2. 类方法与实例方法

2.1 类方法与实例方法的相关解释

我们先来看一个例子:

class Person:
    # 实例方法
    def walk(self):
        print("走路")
    # 类方法,使用@classmethod修饰
    # 类方法的第一个参数是固定的。根据惯例,将其命名为cls。但这也不是必须的。
    @classmethod
    def cm(cls):  # cls就是Person
        print("这是类方法")
        print(cls is Person)
        
p = Person()

观察上述例子,对于类方法,有下面几点需要注意:

  • 注意1 : 类方法,使用@classmethod修饰;
  • 注意2 : 类方法的第一个参数是固定的。根据惯例,将其命名为cls;
  • 注意3 : cls就是Person;
  • 注意4 : 类方法的第一个参数会隐式传递,无需我们显式传递;

2.2 访问类方法

有两种方法可以访问类方法。但是强烈建议,类方法通过类名来访问。

① 通过类名访问类方法

在这里插入图片描述

② 通过对象访问类方法

在这里插入图片描述

2.3 访问实例方法

实例方法只能通过对象访问,而不能通过类名访问。

① 通过对象访问实例方法

在这里插入图片描述

② 通过类名访问实例方法,会报错

通过类名也不是不能访问实例访问,只是需要我们传入一个对象。尽管语法支持,但是不建议这样做。
在这里插入图片描述

2.4 实例方法与类方法 知识总结

实例方法 : 既可以通过对象调用实例方法,也可以通过类名调用实例方法。只不过通过类名调用实例方法,需要显示传递对象,画蛇添足,不建议这么做。

类方法 : 既可以通过类名调用类方法,也可以通过对象调用类方法。但是,强烈建议,通过类名调用类方法。

3. “类方法”与“实例方法”,对“类中属性”进行访问

最好,通过实例方法访问实例属性,通过类方法访问类属性。

class Person:
    desc = "人的描述"
    def __init__(self,name):
        self.name = name 
    def walk(self):
        # 实例方法访问实例属性
        print(self.name + " is walking")
    @classmethod
    def c_m(cls):
        # 尽管这种方式可以修改类属性。但是属于硬编码(表示代码写的太死了),不建议这么做
        # Person.desc = "abcd"    # 假如以后类名Person修改了,这里还需要修改
        # 因为cls就是Person,所以可以用以下方式修改类属性
        cls.desc = "abcd"  # 以后就算是:类名Person修改了,这里也不用动。
        
p = Person("张三")
p1 = Person("李四")

结果如下:
在这里插入图片描述

4. 静态方法

先来看一个例子:

class Person:
    @staticmethod
    def s_m():
        print("这是静态方法")   # 因为没有self和cls。既不能访问类属性,也不能访问实例属性。但是有什么用呢?没多大作用,其实。不用太关心这个
p = Person()

结果如下:
在这里插入图片描述
通过上面的例子,关于静态方法需要注意以下几点:

  • 注意1 : 静态方法使用@staticmethod 修饰,也与所创建的对象无关;
  • 注意2 : 没有self和cls参数。不能访问类属性,也不能访问实例属性。但是有什么用呢?没多大作用;
  • 注意3 : 静态方法最好通过类名去访问,虽然对象也可以访问;
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。