#!/usr/bin/env/python3
# -*- coding:utf-8 -*-
class Mycls():
# 初始化方法
def __init__(self, name="alice"):
self.name = name
# 静态方法
@staticmethod
def my_staticmethod():
print("""【静态方法】独立方法,和类外部方法一致,不能调用类实例self、不能调用类本身cls、不能调用类属性self.name,参数不能带有self、cls""")
print("""【调用方式】
Mycls.my_staticmethod()
Mycls().my_staticmethod()
""")
# 类方法
@classmethod
def my_classmethod(cls):
print("""【类的方法】类的专属方法,cls为默认值可以修改""")
print("""【调用方式】
Mycls.my_classmethod() -- 推荐用类名调用
Mycls().my_classmethod() -- 不推荐用类实例化后,去调用类方法
""")
# 普通方法
def my_generalmethod(self):
print("""【类的方法】类的内部方法,self为默认值可以修改""")
print("""【调用方式】
Mycls().my_generalmethod()
""")
from abc import ABC, abstractmethod
class Myinterface(ABC): # 抽象接口父类必须继承抽象类ABC,子类继承抽象接口父类,必须重写父类的方法
# 抽象接口父类的公共方法(语法糖方式)
@abstractmethod
def common_api1(self):
print("""【抽象方法】抽象父类的接口方法,self为默认值可以修改,抽象子类必须继承父类所有的抽象方法""")
print("""【调用方式】
不能直接实例化,不能直接被调用
test=Myabc() -- 报错:TypeError: Can't instantiate abstract class Myabc with abstract methods common_api1
""")
print("""【源码参考】点击@abstractmethod,跳转源码,其实核心就是将当前抽象类的抽象方法属性改为True
比如:funcobj.__isabstractmethod__ = True,等价于,common_api1.__isabstractmethod__=True""")
pass
# 抽象接口父类的公共方法(源码赋值为True方式)
def common_api2(self):
print("""【抽象方法】抽象父类的接口方法,self为默认值可以修改,抽象子类必须继承父类所有的抽象方法""")
print("""【调用方式】
不能直接实例化,不能直接被调用
test=Myabc() -- 报错:TypeError: Can't instantiate abstract class Myabc with abstract methods common_api2
""")
print("""【源码参考】点击@abstractmethod,跳转源码,其实核心就是将当前抽象类的抽象方法属性改为True
比如:funcobj.__isabstractmethod__ = True,等价于,common_api2.__isabstractmethod__=True""")
common_api1.__isabstractmethod__ = True
class A_interface(Myinterface):
def common_api1(self):
print("""【重写方法】抽象子类的接口方法,self为默认值可以修改,抽象子类必须继承父类所有的抽象方法""")
print("""【调用方式】
test = A_interface()
test.common_api1()
""")
def common_api2(self):
print("""【重写方法】抽象子类的接口方法,self为默认值可以修改,抽象子类必须继承父类所有的抽象方法""")
print("""【调用方式】
test = A_interface()
test.common_api2()
""")
if __name__ == '__main__':
test = A_interface()
test.common_api1()
test.common_api2()
【学记笔记】Python类的初始方法、静态方法、类方法、普通方法、抽象方法、继承方法代码对比
于 2024-04-16 09:52:28 首次发布