欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Python学习——第七章面向对象

时间:2023-05-26
引言

像java一样,Python语言诞生之初就是一门面向对象的语言,利于类和对象来解决问题,接下来就来介绍一下Python的面向对象的相关内容

介绍

类:用来描述具有相同的属性和方法的对象集合,它定义了该集合中每个对象的共有属性和方法,对象是类的实例化
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外,通常不作为实例变量使用
数据成员:类变量或者实例变量,用于处理类及其实例对象的相关数据
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫做方法的覆盖,也称重写
实例变量:定义在方法中的变量,只作用于当前实例的类
继承:指一个派生类继承基类的字段和方法,继承也允许将一个派生类作为一个基类对象对待
实例化:创建一个类的实例,一个类的具体对象
方法:类中定义的方法
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法

定义语法

类必须定义之后才能进行使用,定义一个类就是定义一类对象的模板,格式如下:

class [类名]:[语法块]

类的使用

在使用类之前需要将类实例化成为对象,创建对象和创建变量类似,先要声明对象是哪个类,同时指明变量名称

class EmptyClass:passempty = EmptyClass()print(type(empty))

执行的结果为

类的构造方法

在创建实例时,很多类可能都需要初始状态,所以,一个类可以定义一个特殊的方法,叫做构造方法,构造函数就是类的__init__方法

class Dog:def __init__(self):print("hello")dog = Dog()

执行的结果为

hello

注意,在类实例化时自动调用构造方法,并且构造函数的第一个参数必须为self,不能漏掉,构造函数的返回值必须为None

类的属性

在构造方法中我们可以初始化一些属性

class Dog:def __init__(self,name):self.name = nameself.age = 3dog = Dog("hello")print(dog.name)print(dog.age)

执行结果如下

hello3

注意,属性(或是叫做成员变量、类变量)必须使用self加上点的方式进行赋值,不能直接进行变量的定义,直接定义的变量生命周期只会在函数内,函数执行完毕就会进行销毁

类中的方法

在类中定义的函数就是方法

class Dog:def __init__(self,name):self.name = namedef play(self):print("hello",self.name)dog = Dog("mike")dog.play()

执行的结果为

hello mike

类中的方法和函数的定义相同,除了方法一定要定义在类里面并且第一个参数必须是self外(参数名称不强制要求为self,但一般要求使用self,以便和其它参数进行区分)

私有属性

在前面的例子中,在构造函数中定义的属性,实例可以轻松的获取和修改属性的值,但有时我们需要限制实例随意的修改属性,这时就要用到私有属性,定义私有属性的方法很简单,只要在定义属性名字的时候在前面加上两个下划线作为开头

class Dog:def __init__(self,name):self.___name = namedef play(self):print("hello",self.__name)dog = Dog("mike")dog.play()# 错误print(dog.__name)

在实例中并不能直接访问到私有属性

class Dog:def __init__(self,name):self.__name = nameself.__age = Noneprint(self.__name,"生成成功")def set_gae(self,age):if not isinstance(age,int):print("输入的年龄必须是数字")return Falseif age <= 0:print("年龄必须大于0")return Falseself.__age = agedef play(self):print("我今年",self.__sge)dog = Dog("mike")dog.set_age("hello")dog.set_age(-20)dog.set_age(3)dog.play()

执行的结果为

mike生成成功输入的年龄必须是数字年龄必须大于0我今年 3

通过这种方法,对象年龄的设置必须经历set_age方法,其检验了用户输入的合法性

私有方法

和私有属性的定义方法一致,在方法标识符前面加两个下划线,这种方法不能进行调用

继承和多态

面向对象的三大属性——封装性、继承性、多态性,这里将讲到继承和多态

继承

其基本思想为在一个类的基础上制定出一个新的类,这个类不仅可以继承原来类的属性和方法,还可以增加新的属性和方法,原来的类称为父类,新的类称为子类

其中Python是支持多继承的(一个子类可以继承多个父类)类似c++,也有类似于java的接口和抽象类的相关概念,这将在以后学习到,定义子类的方法如下

class SubClass(baseClass1,baseClass2):语法块

定义要从哪个父类继承只需要在定义子类的名字之后的括号内填入父类的名字就行,如果有多个父类就用逗号进行隔开

继承时需要注意两点
(1)在继承中,如果子类定义了构造方法,则父类的构造方法就不会自动调用,需要在子类的构造方法中专门调用

class Animal:def __init__(self,name):self.name = namedef play(self):print("我是",self.name)class Dog(Animal):def __init__(self):super(Dog,self).__init__("旺财")dog = Dog()dog.play()

执行结果为

我是旺财

(2)子类不能继承父类的私有方法,也不能调用父类的私有方法

多态

继承可以帮我们重复使用代码,但有的适合子类的行为不一定完全和父类的行为完全一致,此时需要将父类方法进行重写

class Animal:def say(self):print("Animal")class Dog(Animal):def say(self):print("Dog")class Cat(Animal):def say(self):print("Cat")dog = Dog()dog.say()cat = cat()cat.say()

执行的结果为

DogCat

前面我们使用到的isinstance函数,是用来判断一个实例是不是某个对象,当我们用其来检验dog、Dog、Animal时会发现dog不仅仅是Dog的实例,也是Animal的实例,cat同理

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。