Python 面向对象学习总结 -类中元素的相互调用总结

Python 面向对象学习总结 -类中元素的相互调用总结(2)



前言

介绍类和对象的调用, 以及实例方法,类方法,静态方法的它们各自的权限和调用方法。

一个类中的元素分类,可以分成两个,一个是方法, 一个是变量。

  • 方法有三个元素
    • 实例方法, 类方法, 静态方法
  • 变量有两个元素
    • 实例属性 , 类属性

讨论一个元素的权限和能被什么调用, 类比是一个人, 就两点
一是权力, 二是 义务 。再回到这个元素。
权力理解为 可以调用 别的方法和变量。 义务理解为 可以被什么调用。

先说方法,方法中可以调用方法和变量,可以被别的方法调用,不能被变量调用。即有权利,有义务
再说变量,变量肯定不可以调用别的,只能被方法调用,所以只有义务没有权力。

调用别的方法和变量有几种方式

调用属性和方法本质就两种方式

  • 第一是通过类名调用,类名可以调用类方法,类属性,静态方法。
  • 第二是通过实例化后的对象去调用,通过对象 可以调用所有可以被调用的元素。

在类的外部我们只有通过类名和对象去调用,这个没有什么疑问
但是在类的内部,可以怎么调用么呢 ? 其实也是和外部调用的本质是一样的。
可以在类里的几种方法内, 通过类名调用 或者实例化类,再通过实例化后的对象去调用。

需要强调一下的是, self 和cls. 这两个一个是实例方法里的。一个是类方法里的。
cls其实就是当前类的类名,所以在类方法里,可以用 传入的 cls.属性名 来调用类属性名, 代替用类名调用。而 self 代表的是当前实例化后的对象,并且是正在调用的对象的,有点矛盾的是self 既然代表的是 实例化后的对象,但是在类里面,本来就是定义类的,为什么能用self 呢,这个其实和类里实例化一个对象,再调用是一样的。关于self 和cls可以参考


一、类本身去调用

类本身可以调用类变量,类方法,静态方法。

class MyClass:
    class_variable = "This is a class variable"

print(MyClass.class_variable)  # 类访问类变量

class MyClass:
    @classmethod
    def class_method(cls):
        print("This is a class method")

MyClass.class_method()  # 类调用类方法

class MyClass:
    @staticmethod
    def static_method():
        print("This is a static method")

MyClass.static_method()  # 类调用静态方法

二、实例方法

  • 实例方法可以通化self ,调用实例方法,类方法,静态方法,类变量,实例变量。
class MyClass:
    class_variable = "This is a class variable"

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

    def instance_method1(self):
        print("This is instance method 1")

    def instance_method2(self):
        self.instance_method1()  # 调用同一个实例中的另一个实例方法
        self.class_method()  # 调用类方法
        self.static_method()  # 调用静态方法
        print("Accessing class variable:", self.class_variable)  # 访问类变量
        print("Accessing instance variable:", self.instance_variable)  # 访问实例变量

    @classmethod
    def class_method(cls):
        print("This is a class method")

    @staticmethod
    def static_method():
        print("This is a static method")


# 创建实例并调用类中的方法和访问属性
obj = MyClass("Instance attribute")
obj.instance_method2()  # 调用实例方法

三、类方法

  • 类方法通过cls 和类名 去调用需要的内容的,类方法可以调用类方法,静态方法 , 类变量。
class MyClass:
    class_variable = "This is a class variable"

    @classmethod
    def class_method1(cls):
        print("This is class method 1")
        cls.class_method2()  # 在类方法中,可以调用同一个类中的另一个类方法
        print("Accessing class variable from class_method1:", cls.class_variable)  # 访问类变量

    @classmethod
    def class_method2(cls):
        cls.static_method()  # 在类方法中调用静态方法
        MyClass.static_method()  # 类方法中,也可以使用类名来调用静态方法
        print("This is class method 2")

    @staticmethod
    def static_method():
        print("This is a static method")


# 调用类方法,从一个类方法内部调用另一个类方法,并访问类变量
MyClass.class_method1()

四、静态方法

  • 静态方法中, 没有self 和cls. 所以就通用的两种方式
    • 类名去调用
    • 实例化对象后调用,但是通过这个调用又违背了静态方法的初衷,所以基本不会这样去用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值