- A+
一、接口
python:类(普通方法 构造) 接口 抽象类(普通方法 抽象方法)
python:抽象类(抽象方法)<=====>接口
方法: 接口中法方法没有方法体:
接口和实现类: 接口中定义规范(方法) 实现类中实现这个方法(必须)
python 没有接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#模拟接口 class Pci: def start(self): pass def stop(self): pass class NetWork(Pci): def start(self): print("开始发送数据包...") def stop(self): print("停止发送数据包...") class Sound(Pci): def start(self): print("开始发送声音数据...") def stop(self): print("停止发送声音数据...") net=NetWork() net.start() net.stop() |
二、抽象类
定义抽象类:
1 2 |
import abc class Pci(metaclass=abc.ABCMeta): pass |
定义抽象方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import abc class Pci: @abc.abstractclassmethod def start(self): pass @abc.abstractclassmethod def stop(self): pass class NetWork(Pci): def start(self): print("开始发送数据包...") def stop(self): print("停止发送数据包...") class Sound(Pci): def start(self): print("开始发送声音数据...") def stop(self): print("停止发送声音数据...") net=NetWork() net.start() net.stop() |
抽象方法:
子类继承抽象类,必须实现抽象类的中抽象方法
子类可以继承抽象类普通,可以不用去实现
注意:
1.抽象类中同时可以有抽象方法和普通方法吗 ? 可以
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import abc class A (metaclass=abc.ABCMeta): def test1(self): print("test1‐‐‐") @abc.abstractmethod def test2(self): pass class B(A): def test2(self): pass b=B() b.test1() b.test2() |
2.有抽象方法的类一定是抽象类?
抽象类中如果去掉修饰抽象((metaclass=abc.ABCMeta):),抽象方法 变为普通方法
3.抽象类可以实例化? 可以
注意:抽象类如果没有抽象方法可以实例化,如果有抽象方法不能实例化
1 2 3 4 |
import abc class Dyan(metaclass=abc.ABCMeta): pass d=Dyan() |
4.可以有构造方法吗?可以
1 2 3 4 5 6 7 8 |
import abc class A(metaclass=abc.ABCMeta): def __init__(self): pass def test1(self): print("test1‐‐‐") a=A() a.test1() |
5.抽象方法可以有方法体吗? 可以有方法体但是没有意义 建议:pass
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import abc class A (metaclass=abc.ABCMeta): def __init__(self): pass def test1(self): print("test1‐‐‐") @abc.abstractmethod def test2(self): print("test2‐‐‐‐‐A") class B(A): pass def test2(self): print("test2‐‐‐‐‐‐‐‐‐‐‐‐") b=B() b.test1() b.test2() |
三、实例方法和静态方法
实例方法:需要实例化对象
调用:
对象.方法名()
1 2 3 4 5 |
class A: def test01(self): print("test01...") a=A() a.test01() |
静态方法: 不需要实例化对象
调用:
类名.方法名( )
对象名.方法名( )
注意:静态方法参数不能写self
1 2 3 4 5 6 |
class A: @staticmethod def test1( ): #静态方法 print("test1‐‐‐‐‐‐‐‐‐‐‐‐‐‐") A.test1() |
静态属性:
调用:
类名.属性名
对象名.属性名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class A: age=20 #静态属性 def __init__(self): self.name="张三" #实例属性 def test1(self): print("test1‐‐‐‐‐‐‐‐‐‐‐‐‐‐") @staticmethod def test2( ): #静态方法 print("test2‐‐‐‐‐‐‐‐‐‐‐‐‐‐") a=A() a.test1() print(a.name) print(a.age) A.test2() # print(A.name) #AttributeError: type object 'A' has no attribute 'name' print(A.age) |
对象名 可以调用实例的属性和方法方法 也可以调用静态属性和方法
类名 :静态的属性和方法
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫