类与对象(二)

326 阅读4分钟

类与对象

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()

#->  雷猴!欢迎来到广东。