Python抽象和自定义类定义与用法示例


Posted in Python onAugust 23, 2018

本文实例讲述了Python抽象和自定义类定义与用法。分享给大家供大家参考,具体如下:

抽象方法

class Person():
  def say(self):
    pass
class Student(Person):
  def say(self):
    print("i am student")

抽象类: 包含抽象方法的类

  • 抽象类可以包含非抽象方法
  • 抽象类可以有方法和属性
  • 抽象类不能进行实例化
  • 必须继承才能使用,且继承的子类必须实现所有抽象方法
import abc
class Person(metaclass=abc.ABCMeta):
  @abc.abstractmethod
  def say(self):
    pass
class Student(Person):
  def say(self):
    print("i am student")
s = Student()
s.say()

补充:函数名和当做变量使用

class Student():
  pass
def say(self):
  print("i am say")
s = Student()
s.say=say
s.say(9)

组装类

from types import MethodType
class Student():
  pass
def say(self):
  print("i am say")
s = Student()
s.say=MethodType(say,Student)
s.say()

元类

# 类名一般为MetaClass结尾
class StudentMetaClass(type):
  def __new__(cls, *args, **kwargs):
    print("元类")
    return type.__new__(cls, *args, **kwargs)
class Teacher(object, metaclass=StudentMetaClass):
  pass
t = Teacher()
print(t.__dict__)

附:python 抽象类、抽象方法的实现示例

由于python 没有抽象类、接口的概念,所以要实现这种功能得abc.py 这个类库,具体方式如下

from abc import ABCMeta, abstractmethod
#抽象类
class Headers(object):
  __metaclass__ = ABCMeta
  def __init__(self):
    self.headers = ''
  @abstractmethod
  def _getBaiduHeaders(self):pass
  def __str__(self):
    return str(self.headers)
  def __repr__(self):
    return repr(self.headers)
#实现类
class BaiduHeaders(Headers):
  def __init__(self, url, username, password):
    self.url = url
    self.headers = self._getBaiduHeaders(username, password)
  def _getBaiduHeaders(self, username, password):
    client = GLOBAL_SUDS_CLIENT.Client(self.url)
    headers = client.factory.create('ns0:AuthHeader')
    headers.username = username
    headers.password = password
    headers.token = _baidu_headers['token']
    return headers

如果子类不实现父类的_getBaiduHeaders方法,则抛出TypeError: Can't instantiate abstract class BaiduHeaders with abstract methods  异常

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
基于Python实现对PDF文件的OCR识别
Aug 05 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
May 21 Python
对Python模块导入时全局变量__all__的作用详解
Jan 11 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
Jan 29 Python
Python实现性能自动化测试竟然如此简单
Jul 30 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
Python实现序列化及csv文件读取
Jan 19 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
matplotlib quiver箭图绘制案例
Apr 17 Python
Python字符串split及rsplit方法原理详解
Jun 29 Python
Python 如何定义匿名或内联函数
Aug 01 Python
python通用数据库操作工具 pydbclib的使用简介
Dec 21 Python
Python引用计数操作示例
Aug 23 #Python
python实现括号匹配的思路详解
Aug 23 #Python
使用Python实现一个栈判断括号是否平衡
Aug 23 #Python
Python wxpython模块响应鼠标拖动事件操作示例
Aug 23 #Python
示例详解Python3 or Python2 两者之间的差异
Aug 23 #Python
Django 限制用户访问频率的中间件的实现
Aug 23 #Python
浅谈Django的缓存机制
Aug 23 #Python
You might like
一个简单的php加密解密函数(动态加密)
2013/06/19 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
2014/04/10 PHP
轻松实现php文件上传功能
2017/02/17 PHP
PHP下用Swoole实现Actor并发模型的方法
2019/06/12 PHP
拖动布局之保存布局页面cookies篇
2010/10/29 Javascript
jquery 学习之二 属性相关
2010/11/23 Javascript
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
2011/05/07 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
js简单实现让文本框内容逐个字的显示出来
2013/10/22 Javascript
一个简单的jquery的多选下拉框(自写)
2014/05/05 Javascript
很不错的两款Bootstrap Icon图标选择组件
2016/01/28 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
Angular 4.0学习教程之架构详解
2017/09/12 Javascript
import与export在node.js中的使用详解
2017/09/28 Javascript
AngularJS中table表格基本操作示例
2017/10/10 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
各个系统下的Python解释器相关安装方法
2015/10/12 Python
python读取Excel实例详解
2018/08/17 Python
Python实用工具FuckIt.py介绍
2019/07/02 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
2020/02/06 Python
使用python实现飞机大战游戏
2020/03/23 Python
django实现日志按日期分割
2020/05/21 Python
西班牙汉普顿小姐:购买帆布鞋和太阳镜
2016/10/23 全球购物
蛋白质世界:Protein World
2017/11/23 全球购物
极度干燥澳大利亚官方网站:Superdry澳大利亚
2019/03/28 全球购物
介绍一下Linux中的链接
2016/05/28 面试题
最热门的自我评价
2013/12/30 职场文书
诚信贷款承诺书
2014/05/30 职场文书
文体活动总结
2015/02/04 职场文书
2015年政风行风工作总结
2015/04/21 职场文书
丧事酒宴答谢词
2015/09/30 职场文书
2016年五一促销广告语
2016/01/28 职场文书
Java 在生活中的 10 大应用
2021/11/02 Java/Android
oracle重置序列从0开始递增1
2022/02/28 Oracle