类与对象
1.类的继承和定制
class Chinese: # 类的创建
eye = 'black' # 类属性的创建
def __init__(self,hometown): # 类的初始化方法
self.hometown = hometown # 实例属性的创建
print('程序持续更新中……') # 初始化中的语句
def born(self): # 实例方法的创建
print('我生在%s。'%(self.hometown)) # 方法的具体语句
wufeng = Chinese('广东') # 类的实例化
print(wufeng.eye) # 打印实例的属性(从类传递的)
wufeng.born() # 实例方法的调用
1.1 类的继承(财产被继承了
类的继承,即让子类拥有了父类拥有的所有属性和方法
1.2 类的定制(“我就是我,是颜色不一样的烟火”)
子类也可以在继承的基础上进行个性化的定制,包括: 创建新属性、新方法 修改继承到的属性或方法
2. 继承的编写规则
2.1 继承的基础语法
class Chinese:
eye = 'black'
def eat(self):
print('吃饭,选择用筷子。')
class Cantonese(Chinese): # 通过继承,Chinese类有的,Cantonese类也有, Chinese是父类,Cantonese是子类
pass # pass表示'跳过',不执行其他操作
yewen = Cantonese() # 子类创建的实例,从子类那间接得到了父类的所有属性和方法
print(yewen.eye) # 子类创建的实例,可调用父类的属性
yewen.eat() # 子类创建的实例,可调用父类的方法
#-> black
#-> 吃饭,选择用筷子。
1、子类创建的实例,同时属于父类; 2、父类创建的实例,不属于子类; 3、所有实例,都属于根类object。
2.2 类的多层继承
继承不仅可以发生在两个层级之间(即父类-子类),还可以有父类的父类、父类的父类的父类……
class Earthman:
eye_number = 2
# 中国人继承了地球人
class Chinese(Earthman):
eye_color = 'black'
# 广东人继承了中国人,同时也继承了地球人。
class Cantonese(Chinese):
pass
yewen = Cantonese()
print(yewen.eye_number)
print(yewen.eye_color)
#-> 2
#-> black
2.3类的多重继承
一个类,可以同时继承多个类,语法为 “class A(B,C,D):” 。和子类更相关的父类会放在更左侧,子类创建的实例在调用属性和方法时,会先在左侧的父类中找,找不到才会去右侧的父类找。(可理解为“就近原则”)
class Su:
born_city = 'Jiangsu'
wearing = 'thick'
def diet(self):
print('我们爱吃甜。')
class Yue:
settle_city = 'Guangdong'
wearing = 'thin'
def diet(self):
print('我们吃得清淡。')
class Yuesu(Yue,Su):
pass
xiaoming = Yuesu()
# 先在 Yue类找,找到了,打印出来。
print(xiaoming.wearing)
# Yue类没有born_city,才去Su类找。
print(xiaoming.born_city)
# 方法调用,和属性调用一样,也符合就近原则。
xiaoming.diet()
#-> thin
#-> Jiangsu
#-> 我们吃得清淡。
越靠近子类(即越靠左)的父类,越亲近,越优先考虑。子类调用属性和方法时,会先在靠左的父类里找,找不到才往右找
3.定制的编写规则
3.1 新增代码
在子类下新建属性或方法,让子类可以用上父类所没有的属性或方法。这种操作,属于定制中的一种:新增代码
class Chinese:
eye = 'black'
def eat(self):
print('吃饭,选择用筷子。')
class Cantonese(Chinese): # 类的继承
native_place = 'guangdong' # 类的定制
def dialect(self): # 类的定制
print('我们会讲广东话。')
yewen = Cantonese()
print(yewen.eye)
# 父类的属性能用
print(yewen.native_place)
# 子类的定制属性也能用
yewen.eat()
# 父类的方法能用
yewen.dialect()
# 子类的定制方法也能用
#-> black
#-> guangdong
#-> 吃饭,选择用筷子。
#-> 我们会讲广东话。
3.2重写代码
1、重写代码,是在子类中,对父类代码的方法修改:
class A():
def Day(self):
print('昨天是day2')
class B(A):
def Day(self):
print('今天是day3')
a=A()
b=B()
a.Day()
b.Day()
#-> 昨天是day2
#-> 昨天是day3
2、在子类中,对父类代码的实例化属性修改:
class A():
def __init__(self,name='卡西'):
self.name=name
def Name(self):
print('我的名字是'+self.name)
class B(A):
def __init__(self,name='延君'):
A.__init__(self,name)
b=B()
b.Name()
class Chinese:
def land_area(self,area):
print('我们居住的地方,陆地面积是%d万平方公里左右。' % area)
class Cantonese(Chinese):
# 为参数 area 设置默认值。
def land_area(self, area = 960, rate = 0.0188):
Chinese.land_area(self, area * rate)
yewen = Cantonese()
yewen.land_area()
#-> 我们居住的地方,陆地面积是18万平方公里左右。
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()
#-> 雷猴!欢迎来到广东。