零基础学Python|Python进阶学习第七天--类和对象

​作者主页:编程指南针

​作者简介:Java、前端、Python开发多年,做过高程,项目经理,架构师

​主要内容:Java项目开发、毕业设计开发、面试技术整理、最新技术分享

​收藏点赞不迷路 关注作者有好处

​文末获得源码

Python进阶学习

一,类和对象

1.1 面向对象概述

面向对象(Object Oriented)的英文缩写是OO,它是一种设计思想,从20世纪60年代提出面向对象的概念到现在,它已经发展成为一种比较成熟的编程思想,并且逐步成为目前软件开发领域的主流技术。

面向对象中的对象(Object),通常是指客观世界中存在的对象,这个对象具有唯一性,对象之间各不相同,各有各的特点,每一个对象都有自己的运动规律和内部状态;对象与对象之间又是可以相互联系、相互作用的。对象也可以是一个抽像的事物。通常将对象划分为静态部分和动态部分,静态部分指对象自身的一些属性,动态部分是对象所执行的一些动作。

类是封装对象的载体,它通过定义公共的属性来方法来描述对象。比如人类(Person),都有自己的姓名、年龄、身高、体重等属性,也可以吃、睡、坐、走等行为,用类来进行描述,可以通过类来创建一个个属性和形态可不相同的具体对象,也就是个人。

面向对象程序设计的三大特征:封装、继承和多态。

1.2 类的定义和使用

在Python中,使用class关键定来定义类:

Class ClassName:
    '''帮助信息'''
    statement

示例:如果在定义类时,没想好编码如何编写,可以使用pass来设置空代码(占位符)

Class Person:
    pass

创建类的实例:

instancename = ClassName(parameterList)

在定义类时,通常会自动创建一个 ‘_ init _()’方法,它相当于Java中的构造方法,在进行实例对象创建时,会自动执行它。它必须包含一个self参数,用于引用自身的属性和方法,也可以添加其它参数。当它只有一个参数时,使用类进行实例化时,就不需要传递参数了。

示例:

#定义类
class Geese:
    '''大雁类'''
    def __init__(self):
        print("我是大雁类")
wildGoose = Geese()

‘_ init _()’方法中,也可以自定义一些参数:

示例:

#定义类
class Geese:
    '''大雁类'''
    def __init__(self,beak,wing,claw):
        print("我是大雁类,我有以下特征:")
        print(beak)
        print(wing)
        print(claw)
        
beak = '喙的基部较高,长度和高度基本一致'
wing_1 = '翅膀长而尖'
claw_1 = '爪子是噗状的'
wildGoose = Geese(beak,wing_1,claw_1)

1.3 创建类的成员并进行访问

类的成员主要由实例方法和数据成员组成,在类中创建了类的成员后,可以通过类的实例进行访问。

1.创建实例方法并进行访问:

实例方法也就是在类中定义的函数,它必须包含一个self参数,而且必须是第一个,语法如下:

def functionname(self,parameterlist)
    block

定义好实例方法后就可以通过实例名来进行调用了:

instancename.functionname(parameterlist)

2.创建数据成员并进行访问:

数据成员是指类中定义的变量,即属性。根据定义的位置,又分为类属性和实例属性。

类属性是指定义在类中,并在函数体外的属性。类属性可以被所有的实例共享访问。可以通过类名或实例名称进行访问。

示例:

#定义类 类属性
class Geese:
    '''大雁类'''
    beak = '喙的基部较高,长度和高度基本一致'
    wing = '翅膀长而尖'
    claw = '爪子是噗状的'
    def __init__(self):
        print("我是大雁类,我有以下特征:")
        print(Geese.beak)
        print(Geese.wing)
        print(Geese.claw)

wildGoose = Geese()

实例属性是指定义在类的方法中的属性,只作用于当前实例中。实例属性只能通过实例名访问,不能通过类名访问。

示例:

#定义类 实例属性
class Geese:
    '''大雁类'''
    def __init__(self):
        self.beak = '喙的基部较高,长度和高度基本一致'
        self.wing = '翅膀长而尖'
        self.claw = '爪子是噗状的'
        print("我是大雁类,我有以下特征:")
        print(self.beak)
        print(self.wing)
        print(self.claw)

wildGoose = Geese()

实例属性也是通过实例名修改访问:

#定义类
class Geese:
    '''大雁类'''   	
    def __init__(self,beak,wing,claw):
   	 	self.neck = '脖子较长'
        print(self.neck)

wildGoose = Geese()
wildGoose1 = Geese()
wildGoose1.neck = '脖子没有天鹅长'
print('wildGoose的脖子:',wildGoose.neck)
print('wildGoose1的脖子:',wildGoose1.neck)

1.4 访问限制

为了保证类中定义的属性和方法不被外部进行访问,Python提供了加单下划线的 _ foo,双下划线的 _ _ foo和首尾都加下载线的 _ foo_ 来进行访问限制。foo此时代下属性或访问名。

_ foo _:表示定义特殊访问,比如初始化方法 _ _init _ _

_ foo:以单下划线开头的表示定义的protected(受保护的)成员,只能通过类和其子类进行访问。但不能使用"from module import *"来进行导入。

示例:

#访问限制
class Swan:
    '''天鹅类'''
    _neck_swan = '天鹅的脖子很长'    #定义保护类型属性
    def __init__(self):
        print("__init__():"+Swan._neck_swan)   #在实例访问中访问私有属性

swan = Swan()     #创建Swan类的实例
print("直接访问:",swan._neck_swan)   # 保护属性可以通过实例名访问

_ _foo:双下划线表示private(私有)类型成员。只允许该类中的方法进行访问,而不能通过实例进行访问。但可以通过’实例名.类名 _ 成员名称’进行访问。

示例:

#访问限制  私有属性
class Swan:
    '''天鹅类'''
    __neck_swan = '天鹅的脖子很长'    #定义私有类型属性
    def __init__(self):
        print("__init__():"+Swan._neck_swan)   #在实例访问中访问私有属性

swan = Swan()     #创建Swan类的实例
print("加入类名:",swan._Swan__neck_swan)  #私有属性,可以通过 “实例名.类名__xxx" 方式访问
print("直接访问:",swan._neck_swan)   # 私有属性不可以通过实例名访问

1.5 属性

在python中,可以通过@property将一个方法转换为属性,从而实现用于计算的属性。将方法转换为属性后,可以直接通过方法名来访问方法,而不需要再添加一对小括号“()”,这样可以让代码更加简洁。

@property
def methodname(self):
    block
* methodname :方法名
* self:必要参数,表示类的实例
* block: 方法体

示例:

#定义属性
class Rect:
    def __init__(self,width,height):
        self.width = width    #矩形的宽
        self.height = height  #矩形的高
    @property                 #将方法转换为属性
    def area(self):           #计算机矩形的面积的方法
        return self.width*self.height   #返回矩形面积
rect = Rect(800,600)          #创建类的实例
print("面积为:",rect.area)     #输出属性的值
   

在Python中,默认情况下,创建的类属性或者实例,是可以在类体外进行修改的,如果想要限制其不能在类体

外修改,可以将其设置为私有的,但设置为私有后,在类体外也不能获取它的值。所以如果想要创建一个可以读取,但不能修改的属性,可以使用@property 实现只读属性。

示例:

#创建只读属性
class TVShow:
    def __init__(self,show):
        self.__show = show
    @property                 #将方法转换为属性
    def show(self):           #定义show()方法
        return self.__show    #返回私有属性的值
tvshow = TVShow("正在播放 青春无悔")   #创建类的实例
print("默认:",tvshow.show)    #获取属性值

但如果你想修改show 的值,就会报错:

tvshow.show = '正在播放  大决战'
print("修改后:",tvshow.show)

报错:

AttributeError: can't set attribute

1.6 继承

继承可以实现代码的重用,同时通过继承可以理顺类与类之间的关系。

class ClassName(baseclasslist):
   '''类的帮助信息'''    #类文档字符串
   statement           #类体

* baseclasslist:用于指定要继承的基类,可以有多个,类名之间用 ,号分隔,如果不指定,将使用所有Python对象的根类object.

方法重写:基类的成员都会被派生类继承,当基类中的某个方法不完全适用于派生类时,就需要在派生类中重写父类的这个方法。

示例:

#继承
class Fruit:
    color = '绿色'
    def harvest(self,color):
        print("水果是:"+color+"的!")
        print("水果已经收获.....")
        print("水果原来是:"+Fruit.color+"的!")
class Orange(Fruit):
    color = "橙色"
    def __init__(self):
        print("\n 我是橘子")
    def harvest(self,color):
        print("橘子是"+color+"的!")
        print("橘子已经收获....")
        print("橘子原来是:"+Fruit.color+"的!")

orange = Orange()
orange.harvest("黄色")

调用基类的 _ _init _ _方法需要通过 super() 来调用:

#调用父类的__init__方法
class Fruit:
    def __init__(self,color="绿色 "):
        Fruit.color = color
    def harvest(self):
        print("水果原来是: "+Fruit.color+"的!")
class Apple(Fruit):
    def __init__(self):
        super().__init__()
        print("我是苹果")
apple = Apple()
apple.harvest()

猜你喜欢

转载自blog.csdn.net/whirlwind526/article/details/132402792