AR之道工作生活

Python基础学习之路(七) ------ 类/继承/重写

2019-07-19  本文已影响1人  千喜Ya

一.创建与调用


可以看到:实例方法的创建语句,和函数的定义语句很类似,唯一不同的是:实例方法中有个必须放在首位的参数self。
特殊参数self的作用:self会接收实例化过程中传入的数据,当实例对象创建后,实例便会代替 self,在代码中运行。换言之,self 是所有实例的替身



调用 :



在类方法中调用类属性注意前面要加self :
class Chinese:

    name = '吴枫'  # 类属性name

    def say(self):     
        print(self.name + '是中国人')

person = Chinese()   # 创建Chinese的实例person
person.say()         # 调用实例方法

同理,如果想在类的方法内部调用其他方法时,我们也需要用到self来代表实例。

第一点:只要在类中用def创建方法时,就必须把第一个参数位置留给 self,并在调用方法时忽略它(不用给self传参)。
第二点:当在类的方法内部想调用类属性或其他方法时,就要采用self.属性名self.方法名的格式。

初始化方法 :
定义初始化方法的格式是def __init__(self),是由init加左右两边的【双】下划线组成( initialize “初始化”的缩写)。

初始化方法的作用在于:当每个实例对象创建时,该方法内的代码无须调用就会自动运行。

class Chinese:
    def __init__ (self):
        self.mouth = 1  # self.不能丢
        self.eye = 2
    
    def body(self):
        print('我有%s张嘴巴' % self.mouth)
        print('我有%s只眼睛' % self.eye)

person = Chinese()
person.body()

使用初始化方法可以不定义类属性,self后面传参,赋值创建类属性 :

class Chinese:
    # 初始化方法的创建,init两边双下划线。
    def __init__(self, hometown):
        self.hometown = hometown
        print('你在哪里出生?')
    
    def born(self):
        print('我生在%s。' % self.hometown)

wufeng = Chinese('广东') # 传给参数hometown
wufeng.born()

面向对象和面向过程的区别:


二.类继承


很多类在创建时也不带括号,但实际上也是有父类的,class Chinese:在运行时相当于class Chinese(object):。而object,是所有类的父类,我们将其称为根类(可理解为类的始祖)。

判断某个实例是否属于某个类 : 函数isinstance()

# 阅读完代码再运行。
class Chinese:
    pass

class Cantonese(Chinese):
    pass

gonger = Chinese()
# 宫二,电影《一代宗师》女主,生于东北
yewen = Cantonese()
# 叶问,电影《一代宗师》男主,生于广东

print('\n验证1:子类创建的实例同时也属于父类')
print(isinstance(gonger,Chinese))  
print(isinstance(yewen,Chinese))  

print('\n验证2:父类创建的实例不属于子类。')
print(isinstance(gonger,Cantonese))

print('\n验证3:类创建的实例都属于根类。')
print(isinstance(gonger,object))  
print(isinstance(yewen,object))

多层继承 : 子类创建的实例可调用所有层级父类的属性和方法。

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)

多重继承 : 和子类更相关的父类会放在更左侧。创建的实例在调用属性和方法时,会先在左侧的父类中找,找不到才会去右侧的父类找。(可理解为“就近原则”)

image.png

三.重写

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)

子类继承父类方法的操作是在def语句后接父类.方法(参数),如上述代码的第八、九行。

重写示例 :

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()
上一篇下一篇

猜你喜欢

热点阅读