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. 所以就通用的两种方式
- 类名去调用
- 实例化对象后调用,但是通过这个调用又违背了静态方法的初衷,所以基本不会这样去用