博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python类的继承、封装和多态
阅读量:4311 次
发布时间:2019-06-06

本文共 2327 字,大约阅读时间需要 7 分钟。

摘自https://www.cnblogs.com/evablogs/p/6724477.html

 

继承

1
2
3
4
5
6
7
8
class 
Person(
object
):
    
def 
__init__(
self
, name, gender):
        
self
.name 
= 
name
        
self
.gender 
= 
gender
class 
Student(Person):
   
def 
__init__(
self
, name, gender,score):                        
#score属性是子类自己的属性
        
super
(Student,
self
).__init__(name,gender)                 
#super(子类名称,self).__init__(继承父类的属性1,属性2):初始化父类,继承Person父类的name和gender属性
        
self
.score
=
score

除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。

多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。

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
#哪类人
class 
Person(
object
):
    
pass
 
class 
Student(Person):
    
pass
 
class 
Teacher(Person):
    
pass
 
class 
SkillMixin(
object
):
    
pass
 
#技能类
class 
BasketballMixin(SkillMixin):
    
def 
skill(
self
):
        
return 
'basketball'
 
class 
FootballMixin(SkillMixin):
    
def 
skill(
self
):
        
return 
'football'
 
#拥有哪种技能的人的类型
class 
BStudent(Student, BasketballMixin):                               
#既是学生,又会打篮球的人,即继承学生类,也继承篮球技能类,多重继承
    
pass
 
class 
FTeacher(Teacher, FootballMixin):
    
pass
 
= 
BStudent()
print 
s.skill()
 
>>> basketball
 
= 
FTeacher()
print 
t.skill()
>>> football

 

多态

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
class 
Person(
object
):
     
def 
__init__(
self
,name):
          
self
.name
=
name
     
def 
a(
self
):                                               
#Person父类的a方法
          
return 
'I am a Person,my name is %s' 
%
self
.name
class 
Student(Person):
      
def 
__init__(
self
,name,age):
           
super
(Student,
self
).__init__(name)
           
self
.age
=
age
      
def 
a(
self
):                                              
#Student子类的a方法
          
return 
'I am a Student,my name is %s' 
%
self
.name   
class 
Teacher(Person):
      
def 
__init__(
self
,name,score):
           
super
(Teacher,
self
).__init__(name)
           
self
.score
=
score
      
def 
a(
self
):                                              
#Teacher子类的a方法
          
return 
'I am a Teacher,my name is %s' 
%
self
.name   
def 
show_a(x):                                                  
#定义一个方法,用于接收x参数,返回每个类实例对象相对应的方法
     
print 
a()
 
 
p
=
Person(
'Bob'
)
s
=
Student(
'Alice'
,
12
)
t
=
Teacher(
'Lily'
,
80
)
 
 
结果:
>>> show_a(p)
I am a Person,my name 
is 
Bob
 
>>> show_a(s)
I am a Student,my name 
is 
Alice
 
>>> show_a(t)
I am a Teacher,my name 
is 
Lily
 
结果返回子类自己的方法,但当子类的方法找不到时会顺着子类找到父类相对应的方法

 封装

将细节封装起来提供一个接口被访问,有效地保证了细节的安全。

1
2
3
4
5
6
7
8
9
class 
Person(
object
):
      
def 
__init__(
self
):
           
self
.__name
=
'a'
     
@property                                   
#使用@property将一个方法name变成属性,可以直接.name访问
      
def 
name(
self
):                            
#封装self.__name属性
           
return 
self
.__name                   
 
p1
=
Person()
p1.name                                          
#p1.name可以直接访问name方法

 

转载于:https://www.cnblogs.com/yuer20180726/p/10790349.html

你可能感兴趣的文章
openstack报错解决二
查看>>
linux source命令
查看>>
openstack报错解决三
查看>>
乙未年年终总结
查看>>
子网掩码
查看>>
第一天上班没精神
查看>>
启动eclipse报错:Failed to load the JNI shared library
查看>>
eclipse安装插件的两种方式在线和离线
查看>>
linux下源的相关笔记(suse)
查看>>
linux系统分区文件系统划分札记
查看>>
Linux(SUSE 12)安装Tomcat
查看>>
Linux(SUSE 12)安装jboss4并实现远程访问
查看>>
Neutron在给虚拟机分配网络时,底层是如何实现的?
查看>>
netfilter/iptables全攻略
查看>>
Overlay之VXLAN架构
查看>>
Eclipse : An error occurred while filtering resources(Maven错误提示)
查看>>
在eclipse上用tomcat部署项目404解决方案
查看>>
web.xml 配置中classpath: 与classpath*:的区别
查看>>
suse如何修改ssh端口为2222?
查看>>
详细理解“>/dev/null 2>&1”
查看>>