本文实例讲述了Python抽象和自定义类定义与用法。分享给大家供大家参考,具体如下:
抽象方法
1
2
3
4
5
6
|
class Person(): def say( self ): pass class Student(Person): def say( self ): print ( "i am student" ) |
抽象类: 包含抽象方法的类
- 抽象类可以包含非抽象方法
- 抽象类可以有方法和属性
- 抽象类不能进行实例化
- 必须继承才能使用,且继承的子类必须实现所有抽象方法
1
2
3
4
5
6
7
8
9
10
|
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() |
补充:函数名和当做变量使用
1
2
3
4
5
6
7
|
class Student(): pass def say( self ): print ( "i am say" ) s = Student() s.say = say s.say( 9 ) |
组装类
1
2
3
4
5
6
7
8
|
from types import MethodType class Student(): pass def say( self ): print ( "i am say" ) s = Student() s.say = MethodType(say,Student) s.say() |
元类
1
2
3
4
5
6
7
8
9
|
# 类名一般为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 这个类库,具体方式如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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程序设计有所帮助。
原文链接:https://blog.csdn.net/smj20170417/article/details/81133911