python

当前位置:首页 > python面向对象 > 当前文章

python面向对象

类属性、类方法、实例属性、实例方法的区别

2020-10-05 184赞 老董笔记
每篇文章努力于解决一个问题!更多精品可移步文章底部。

  深入一点学习类和面向对象,必须有1个意识:

  类有类的内存空间,每个对象有自己的内存空间,只有具备这个常识才能理解面向对象一些行为

# -*- coding:utf-8 -*-

class Person:

    def __init__(self,my_name,my_age):
        self.name = my_name  # 实例变量
        self.age = my_age  # 实例变量

    def sleep(self):
        print('打怪累了,睡一会')

if __name__ =="__main__":
    p = Person('老董',30)
    Person.sleep(p) # 等价于 p.sleep()
    p.sleep()
打怪累了,睡一会
打怪累了,睡一会

  类属性和实例属性

  从表达意义上说,类属性是用来描述整个类(比如人类的数量),实例属性是描述单个对象的(每个人的name、age等)。

  1)在类中定义,但是定义在类里面各种方法之外的变量,称为类属性或类变量。

  2)在类里面的方法内部以self.xxx的方式定义的变量,称为实例属性或实例变量,用(对象.变量名)调用。

  3)类变量为每个对象所共享,类变量可用(类名.类变量名)或者(对象.类变量名)调用。每个对象内部有指针指向自己所属的类,1个对象调用属性时对象内部没有就会去类里寻找。

# -*- coding:utf-8 -*-

class Person:

    count = 0  # 类属性

    def __init__(self,my_name):
        self.name = my_name  # 实例变量
        Person.count += 1 # 类名调用类属性

    place = '地球' # 类属性

if __name__ =="__main__":
    p_objs = []
    for i in range(5):
        p = Person(f'老董{i}')
        p_objs.append(p)
    print(f'现有{Person.count}个人') # 类调用类属性
    print(f'现有{p_objs[0].count}个人') # 对象调用类属性
    print(Person.place)
现有5个人
现有5个人
地球


  类方法和实例方法

  1)实例方法最少包含一个参数,通常命名为self,self代表对象本身。类方法最少也包含一个参数,通常命名为cls,cls代表类本身,类方法需要使用@classmethod进行修饰。

  2)实例方法通常用对象调用(对象.方法名),类方法通常用类名调用(类名.类方法名)

  3)每个对象内部有指针指向自己所属的类,故而对象可以调用类方法(尽量避免这么做),类也有方式去调用对象的方法(但是没有必要这么写)。

# -*- coding:utf-8 -*-
import random

class Person:

    count = 0

    def __init__(self,my_name,my_age):
        self.name = my_name  # 实例变量
        self.age = my_age  # 实例变量
        Person.count += 1 # 类名调用类属性

    # 实例方法
    def attack (self,num):
        print(f'{self.name}进攻了{num}米')

    # 类方法
    @classmethod
    def belief(cls):
        print('我们的信念:勇往直前')

if __name__ =="__main__":
    p_objs = []
    for i in range(1,3):
        p = Person(f'老董{i}',30)
        p_objs.append(p)
    print(f'现有{Person.count}个人')
    Person.belief() # 类方法
    for p in p_objs:
        p.attack(random.randint(1,5))
现有2个人
我们的信念:勇往直前
老董1进攻了2米
老董2进攻了1米

文章评论

类属性、类方法、实例属性、实例方法的区别文章写得不错,值得赞赏