类的继承和定制

类的继承

类的继承主要指类的从属关系,比如A类属于B类的话,B类的范围更广,A类作为B类的子类可以继承B类的属性和方法,且这种继承可以没有限制,多层继承。另外一种,A类可以C,D,F的子类,此时A可以调用CDF的属性和方法,需要注意的是顺序表示类之间的相同性越近。
类的继承的语法

class A(B): #单一继承
	pass
class H(A):
	pass #H与B之间为多层继承
class A(C,D,F):#多重继承
	pass

子类的实例可以调用父类的属性和方法,没有限制,多重继承关系中首先从第一顺位(也就是上面的C)开始寻找是否具有调用的属性或方法,没有则顺次后移寻找。
python库里所有的类都是Object的子类,因此Object也叫根类。
判断某两类之间的关系用isinstance(A,B),返回布尔值。

类的定制

类的定制指在已经具有继承关系的前提下,子类可以对父类的属性或方法进行修改,满足不同的运行需求。
一般有两种定制:新增代码,重写代码
新增代码:

class Chinese:

    def land_area(self,area):
        print('我们居住的地方,陆地面积是%d万平方公里左右。'% area)
##上面是父类
class Cantonese(Chinese): ##子类
	live_place = 'guangdong'  #新增属性
	def dialect(self):   #新增方法
		print('讲广东话')
yewen = Cantonese() #类的实例化创建yewen
print(yewen.live_place) #调用子类新增的属性
yewen.dialect()  #调用子类新增的方法
	

重写代码:

class Chinese:

    def land_area(self,area):
        print('我们居住的地方,陆地面积是%d万平方公里左右。'% area)

class Cantonese(Chinese):
    # 间接对方法进行重写
    def land_area(self, area, rate = 0.0188): #对父类方法的重写
        Chinese.land_area(self, area * rate) #对父类方法的重写
        # 直接继承父类方法,再调整参数。

gonger = Chinese() #父类实例创建
yewen = Cantonese() #子类实例创建
gonger.land_area(960) #父类方法调用
yewen.land_area(960)#子类方法调用

初始化方法的定制

class Chinese:
    def __init__(self, greeting='你好', place='中国'):
        self.greeting = greeting
        self.place = place

    def greet(self):
        print('%s!欢迎来到%s。' % (self.greeting, self.place))

# 请为子类完成定制,代码量:两行。
class Cantonese(Chinese):
    def __init__(self,greeting='雷猴',place='广东'): #若修改参数时,已有的默认参数不需要修改时可不必再重复
        Chinese.__init__(self,greeting,place)
    
yewen = Cantonese()
yewen.greet()

13关作业练习2

class Student:
    def __init__(self, name, job=None, time=0.00, time_effective=0.00): 
        self.name = name
        self.job = job
        self.time = time
        self.time_effective = time_effective

    def count_time(self, hour, rate):
        self.time += hour
        self.time_effective = hour * rate

# 请你完成子类的定制(包括初始化方法和count_time函数)
class Programmer(Student):
    #def __init__(self,name,job='programmer',time=0,time_effective=0):
        #Student.__init__(self,name,job,time,time_effective)
        #注释掉的是我写的,子类里面姓名是一直变化,后面三个参数是默认值,可在定制中省略
    def __init__(self, name):
        Student.__init__(self, name, job='programmer', time=0.00, time_effective=0.00)  
    def count_time(self,hour,rate=1):
        Student.count_time(self,hour,rate)

# 通过两个实例,完成子类和父类的对比(可自行验证)
student1 = Student('韩梅梅')
print(student1.job)
student1.count_time(8,0.8)
print(student1.time_effective)
student2 = Programmer('李雷')
print(student2.job)
student2.count_time(8)
print(student2.time_effective)

结果:
None
6.4
programmer
8

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值