Py003-01-05抽象类与归一化

抽象类与归一化

以下都属于动物,它们都有走的方法,只是形式不同

java中提供一种接口的方式来实现方法的统一,但是python中没有,以下为java代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
=================第一部分:Java 语言中的接口很好的展现了接口的含义: IAnimal.java
/*
* Java的Interface接口的特征:
* 1)是一组功能的集合,而不是一个功能
* 2)接口的功能用于交互,所有的功能都是public,即别的对象可操作
* 3)接口只定义函数,但不涉及函数实现
* 4)这些功能是相关的,都是动物相关的功能,但光合作用就不适宜放到IAnimal里面了 */

package com.oo.demo;
public interface IAnimal {
public void eat();
public void run();
public void sleep();
public void speak();
}

=================第二部分:Pig.java:猪”的类设计,实现了IAnnimal接口
package com.oo.demo;
public class Pig implements IAnimal{ //如下每个函数都需要详细实现
public void eat(){
System.out.println("Pig like to eat grass");
}

public void run(){
System.out.println("Pig run: front legs, back legs");
}

public void sleep(){
System.out.println("Pig sleep 16 hours every day");
}

public void speak(){
System.out.println("Pig can not speak"); }
}

=================第三部分:Person2.java
/*
*实现了IAnimal的“人”,有几点说明一下:
* 1)同样都实现了IAnimal的接口,但“人”和“猪”的实现不一样,为了避免太多代码导致影响阅读,这里的代码简化成一行,但输出的内容不一样,实际项目中同一接口的同一功能点,不同的类实现完全不一样
* 2)这里同样是“人”这个类,但和前面介绍类时给的类“Person”完全不一样,这是因为同样的逻辑概念,在不同的应用场景下,具备的属性和功能是完全不一样的 */

package com.oo.demo;
public class Person2 implements IAnimal {
public void eat(){
System.out.println("Person like to eat meat");
}

public void run(){
System.out.println("Person run: left leg, right leg");
}

public void sleep(){
System.out.println("Person sleep 8 hours every dat");
}

public void speak(){
System.out.println("Hellow world, I am a person");
}
}

=================第四部分:Tester03.java
package com.oo.demo;

public class Tester03 {
public static void main(String[] args) {
System.out.println("===This is a person===");
IAnimal person = new Person2();
person.eat();
person.run();
person.sleep();
person.speak();

System.out.println("\n===This is a pig===");
IAnimal pig = new Pig();
pig.eat();
pig.run();
pig.sleep();
pig.speak();
}
}

java中的interface

如果你非要实现如上的接口一样的效果,你需要借助一个模块 abc模块

抽象类概念

  • 抽象类只能被继承,无法被实例化
  • 抽象类定义的抽象方法子类必须实现否则报错
  • 抽象类的属性子类可以查找到(前提是子类本身没有该属性)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import abc

# 只进行接口的定义
class Animal(metaclass=abc.ABCMeta):
category = 'animal'
@abc.abstractmethod
def run(self):
pass
@abc.abstractmethod
def eat(self):
pass

class People(Animal):
def run(self):
print('人 跑')
def eat(self):
print('人 吃饭')

class Pig(Animal):
def run(self):
print('猪 跑')
def eat(self):
print('猪 吃饭')

class Dog(Animal):
def run(self):
print('狗 跑')
def eat(self):
print('狗 吃饭')

# a = Animal() 报错 抽象类 只能被继承,无法实例化

people = People()
people.run()
people.eat()

pig = Pig()
pig.run()
pig.eat()

dog = Dog()
dog.run()
dog.eat()

我们知道People继承了 Animal,如果注释了People内部的eat方法就会报错。因为抽象方法必须实现

这样就实现了接口的统一,归一化