python3.6:基础语法:类

python3.6:基础语法:类

      在以前刚刚开始学c++的时候,因为习惯了学习过的c语言设计“基于过程”的思维方式,有很长一段时间都不习惯类和对象的概念。当然完全理解了类和对象的概念之后再回头想,就觉得“类”和“对象”这个名称其实很形象也很好理解。

      ”类“,一类事物,包含了一系列共同特征和行为的一大类对象的集合。

      ”对象“,基于类创建的对象是这类事物中一个个体,它具备这类事物通用的特征和行为,也可以具有自己独特的特性。

       所以类是模糊的,而对象是具体的。比如人是一个类,那么李小明这个人就可以是人这个类的一个对象。那么假如世界上有千千万万个重名的李小明,那么李小明也可以是一个类,但同班的那个170cm高/75kg/长得黑的同学李小明就是这个”李小明“类的一个对象,而身高体重肤色这些,就是他的属性。

1.创建和使用类

      (1)简单的类的创建和使用:

                1)类的创建:

# “人”类的创建
class People():
    # 【1】__init__()为构造函数,每次创建实例时自动调用
    # 形参self是一个指向实例本身的引用,让实例可以访问类的属性和方法
    def __init__(self, height, weight, name):
        # height、weight和name是类的两个属性,当创建实例时自动用给出的实参赋给形参并初始化两个属性
        self.height = height
        self.weight = weight
        self.name = name

    # 【2】定义类的两个方法,分别是say_hi()和say_bye()
    def say_hi(self):
        print(self.name, 'says:', 'Hi everyone!')

    def say_bye(self):
        print(self.name, 'says:', 'Goodbye everyone!')

                2)类的使用:

                      下面根据上一节创建的people类创建一个“李小明”的实例,他的身高为170cm,体重为75kg。

# 创建people类的实例LiXiaoming
# height属性值为170,weight属性值为75,name属性值为‘LiXiaoming’
LiXiaoming = People(170, 75, ‘LiXiaoming’)

# 调用实例LiXiaoming的两个方法
LiXiaoming.say_hi()
LiXiaoming.say_bye()

# 访问实例LiXiaoming的两个属性
print(LiXiaoming.height)
print(LiXiaoming.weight)

                      也可以创建多个类的实例,如“张小红”、“王小强”、“高小文”。

ZhangXiaohong = People(160, 50, 'ZhangXiaohong')
WangXiaoqiang = People(180, 60, 'WangXiaoqiang')
GaoXiaowen = People(175, 90, 'GaoXiaowen')

                3)类的属性操作:

                      a.设定属性默认值:

                         设定属性默认值有两种方式。

                         第一种是在构造函数中以函数默认值的方式给出,如下面代码中的hair_style属性,它在构造函数的形参列表中给出,在创建实例时这个值可以给出实参,那么实参将覆盖原默认值,如果不给出实参,那么将由默认值对这个属性进行初始化。

                         第二种是在构造函数内部给出,,如下面代码中的finger_numbers那么这个属性名将不作为构造函数的参数,在创建实例时也不可以对这个属性再进行赋值,只能由默认值初始化这个属性,后续可通过修改属性值进行修改。

# 创建people类
class People( ):
    #1.hair_style属性在形参列表中给出默认值
    def __init__(self, height, weight, hair_style='long'):
        self.height = height
        self.weight = weight
        self.hair_style = hair_style
        #2.finger_numbers属性在构造函数函数体中给出默认值
        self.fingers_number = 10


# 实例1:hair_style和finger_number属性均直接使用默认值
LiXiaoming = People(170, 75)
print(LiXiaoming.hair_style)
print(LiXiaoming.fingers_number)


# 实例2:hair_style由给定实参赋值,finger_number直接使用默认值
ZhangXiaohong = People(160, 45, 'short')
print(ZhangXiaohong.hair_style)
print(ZhangXiaohong.fingers_number)

                      b.修改属性值:

                          1.直接修改属性值:

# 代码接上一节的people类
# 1.创建实例,输出属性值
LiXiaoming = People(170, 75)
print(LiXiaoming.hair_style)
print(LiXiaoming.fingers_number)


# 2.修改实例的属性值,再次输出属性值
LiXiaoming.weight = 80
LiXiaoming.hair_style = 'short'
print(LiXiaoming.weight)
print(LiXiaoming.hair_style)

                         2.通过方法修改属性值:

# 创建people类
class People( ):
    def __init__(self, height, weight):
        self.height = height
        self.weight = weight

    # taller()函数用于修改height属性值,调用函数在原有height基础上递增指定值
    def taller(self, length):
        self.height += length

    # weight()函数用于修改weight属性值,调用函数直接替换原有weight属性值
    def weight_change(self, weightnow):
        self.weight = weightnow


# 创建实例李小明
LiXiaoming = People(170, 75)
# 修改height属性值
LiXiaoming.taller(2)
print(LiXiaoming.height)
# 修改weight属性值
LiXiaoming.weight_change(70)
print(LiXiaoming.weight)

2.继承

      (1)继承的格式:

               当需要创建的类是一个已经编写好的类的特殊版本,例如女人相对于人类、轿车相对于汽车,就可以用到继承。子类继承父类的所有属性和方法,也可以额外定义自己的属性和方法。

# 【1】创建people类
class People():
    def __init__(self, height, weight, name):
        self.height = height
        self.weight = weight
        self.name = name

    # 定义类的两个方法,分别是say_hi()和say_bye()
    def say_hi(self):
        print(self.name, 'says:', 'Hi everyone!')
    def say_bye(self):
        print(self.name, 'says:', 'Goodbye everyone!')



# 【2】创建woman类,继承父类people类
# 注意此处括号内People
class Woman(People):
    # 注意构造函数内容发生变化
    def __init__(self, height, weight, name):
        super().__init__(height, weight, name)

# 创建实例,访问继承父类的属性并调用继承父类的算法
ZhangXiaohong = Woman(163, 50, 'ZhangXiaohong')
print(ZhangXiaohong.height)
ZhangXiaohong.say_hi()

      (2)子类添加属性和方法:

# 接上一节父类people类,创建People的子类woman类
class Woman(People):
    # 子类新增参数hair_style
    def __init__(self, height, weight, name, hair_style):
        super().__init__(height, weight, name)
        # 设置新增参数值hair_style
        self.hair_style = hair_style


    # 子类新增方法change_hair()
    def change_hair(self):
        if self.hair_style == 'short':
            self.hair_style = 'long'
        elif self.hair_style == 'long':
            self.hair_style = 'short'
        else:
            self.hair_style = self.hair_style


# 创建woman类的实例ZhangXiaohong
ZhangXiaohong = Woman(163, 50, 'ZhangXiaohong', 'short')
# 输出子类新增的属性值
print(ZhangXiaohong.hair_style)
# 调用子类新增的方法
ZhangXiaohong.change_hair()
print(ZhangXiaohong.hair_style)

      (3)重写父类方法:

                当父类的方法不符合子类的需要时,可以对其进行重写,为此可以在子类中定义一个与之重名的方法,对该父类方法进行覆盖。

# 创建People类的子类woman类
class Woman(People):
    def __init__(self, height, weight, name, hair_style):
        super().__init__(height, weight, name)
        self.hair_style = hair_style

    def change_hair(self):
        if self.hair_style == 'short':
            self.hair_style = 'long'
        elif self.hair_style == 'long':
            self.hair_style = 'short'
        else:
            self.hair_style = self.hair_style
    
    # 重写父类方法say_hi()
    def say_hi(self):
        print('a girl called', self.name, 'says:', 'Hi everyone!')


# 创建woman类的实例并调用重写后的方法say_hi()
ZhangXiaohong = Woman(163, 50, 'ZhangXiaohong', 'short')
ZhangXiaohong.say_hi()

      (4)将实例作为属性:

                当类中包含的内容过多时,可以创建一个新类,将原类的一部分属性和方法抽取出来放到其中,再将新类的一个实例作为原类的属性。通过这种方法可以将一个复杂的类拆分成若干个小类,使代码更加简洁明了。


# 创建Stature(身材)类,将与身材有关的属性和方法统一放到这个类中
class Stature():
    def __init__(self, height, weight):
        self.height = height
        self.weight = weight

    # taller()函数用于修改height属性值,调用函数在原有height基础上递增指定值
    def taller(self, length):
        self.height += length

    # weight()函数用于修改weight属性值,调用函数直接替换原有weight属性值
    def weight_change(self, weightnow):
        self.weight = weightnow



# 创建people类,将Stature类实例化作为本类的一个属性
class People():
    def __init__(self,  name, height, weight):
        self.name = name
        # 将Stature类实例化并作为本类的属性
        self.stature = Stature(height, weight)

    # 定义类的两个方法,分别是say_hi()和say_bye()
    def say_hi(self):
        print(self.name, 'says:', 'Hi everyone!')
    def say_bye(self):
        print(self.name, 'says:', 'Goodbye everyone!')


# 创建people类的实例
LiXiaoming = People('LiXiaoming', 170, 75)
# 打印Lixiaoming关于身材的属性值
print(LiXiaoming.stature.weight)
print(LiXiaoming.stature.height)

3.类的导入

      将创建的类放在people.py模块中,在另一个文件中导入people.py中的类有如下几种形式,也可以通过这种方式来使用python的标准库及其他程序员编写好的模块。

# 从people.py模块中导入People类
from people import People

# 从people.py模块中导入People类和Woman类
from people import People, Woman

# 导入people.py模块中的所有类
from people import *

# 导入people.py模块
import people
发布了84 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_39504171/article/details/103798985