Python学习记录之函数、对象和类、继承和多态



前言

最近在自学python,现将学习笔记记录下来,一起学习。


提示:以下是本篇文章正文内容

一、函数

  1. 函数参数可以为空
  2. return不是必需的,无return则返回None。None是一个文字类型,用于表示缺少值。None通常分配为NoneType变量,以指示该变量不指向任何对象。
  3. 函数调用必须在定义函数后出现,否则会出现“NameError”报错

1、变量范围

变量的作用域是指程序中可以访问该变量的部分。
在函数中创建的变量称为局部变量。局部变量只能在定义它的函数的主体内部访问。
全局变量 是在任意函数外部定义的变量,全局变量的作用域从定义它们的点开始,一直持续到程序结束。

2、按值传递

python中所有内容都是对象。因此,对象的变量实际上是对对象的引用。换句话说,变量存储对象在内存中的地址,不包含实际对象本身(这句话实际没太看懂,对象本身是什么?不是地址吗)。
当使用参数调用函数时,它是将参数中的存储的对象的地址传递给参数变量。但是为了简单起见,我们说参数的值在调用函数时传递给参数,此机制称为按值传递

3、位置和关键参数

函数可以以两种方式传递参数:位置参数和关键字参数
第一种方法,将参数传递给函数的顺序与函数标头中各自参数的顺序相同。
第二种方法,将参数名称与值相关联,即parameter_name=val,所以此时函数调用中参数的顺序无关重要。
可以把位置参数和关键字参数混合,但是位置参数只能出现在关键字参数之前

4.默认参数

默认参数是函数定义时指定参数的值。调用函数若给了参数的值,则按传递的参数运行函数,否则按默认值运行函数。

二、模块

模块是以扩展名 .py 结尾的普通python文件。可以再模块内定义一组类、函数、变量、常量等。要重用模块中定义的类或函数,我们必须使用语句在程序中导入模块。语法如下:

import module_name

该语句搜索模块,解析并执行其内容,使其可供客户端程序使用。客户端程序是使用模块中定义的类、函数或变量而不知道实现细节的程序。
在模块中,用于命名类、函数或变量等实体的标识符必须是唯一的。如果找到两个使用相同名称的实体,则python将使用最后一个定义。

倘若不想把整个模块导入,而只导入某些类或函数,可以用以下语句导入

from modele_name import name1,..., nameN

导入整个模块也可以用以下语句:

from module_name import *

此语句在功能上等效与 import module_name. 唯一区别是* 这个语句允许访问客户端中的标识符,而无需在客户端程序代码前加代码前缀。

注:import module_name 不会导入双下划线字符开头的模块

二、对象和类

两种编程模式:过程编程和面向对象编程
过程编程:使用一系列步骤来告诉计算机该做什么。可以将过程视为特定任务的函数。过程编程背后的中心思想是创建可以重用的函数来操作数据。

面向对象编程,围绕对象而不是过程。对象是包含数据以及对数据进行操作的过程的实体。对象内的数据和过程分别称为 属性方法。在创建对象之前,我们首先必须定义一个类。

类只是一个模板,在其中定义属性和方法。当定义一个类时,基本上创建了一个新的数据类型。要注意,类只是一个蓝图,类本身不做任何事。要使用类,我们必须常见基于该类的对象。对象也称为类或类实例的实例,或仅称为实例。从类创建对象的过程称为 实例化类,可以根据需要创建任意数量的对象。

定义类的语法格式如下:

clss class_name([parent_class_name]):
    <method_define_1>
    ...
    <method_define_N>

类名后括号是可选的。
类中定义的方法都需要名为 self 的参数。在python中,每个方法都需要该参数。该参数引用调用该方法的对象。Python 使用参数来知道类要对哪个对象进行操作。调用方法时,无需向参数传递任何值,python解释器会在调用方法时自动将参数绑定到对象。

类中名为 __ init__ 的方法,称为初始值设定项或构造函数的特殊方法。每次在内存中创建新对象时都会调用它。初始值设定项方法的目的是创建具有某些初始值的对象属性。而定义构造函数__init__不是必需的。如果不定义,python会自动提供一个空的 __ init__ 方法,它什么都不做。除了参数之外,方法还期望参数为对象的属性提供实例方法。每个单独的对象都有自己的一组实例变量。这些变量存储对象的数据。实例变量和关键字self的作用于仅限于类的主体。在类中,使用 self.xx 访问对象的属性和方法。

1.创建对象

可以像调用函数一样,用以下语句创建对象

className() ## 创建对象

如果定义了__init__方法,则需要使用参数调用

className(arguments) //其中参数必须与__init__方法中的参数匹配,但不带self,否则会报错

mycircle = Circle(5)
// 1. 创建对象。Circle类的对象
// 2. 调用__init__方法,将新创建的对象传递给self,并将5传递给属性radius
// 3. 为radius引用的对象self创建以初始值命名的属性
// 4. 返回Circle对象
// 5. 将Circle对象的引用赋给mycircle
// 请注意,mycircle仅包含对象的引用(地址),而并非实际对象的引用(没有看懂的一句话)

2.访问属性和方法

一旦有了一个类的对象,就可以用它来访问对象的属性(或实例变量)和方法,语法:

对象.xx

请注意,在调用实例方法时,我们不会向参数self传递任何值,因为python会自动将引用传递给用于方法调用到参数的对象。因此,在这种情况下,变量引用的对象将传递给参数。但是,不允许在代码中将self参数传递给参数self,否则会报错。

可以对对象的属性进行更改:同一类实例化的不同对象存储于内存中的不同位置,且每个对象的属性也存储在不同的内存位置。

3.隐藏对象的属性

默认情况下,对象的属性在类外部可见。因此可以访问。大多数情况下不会在类之外授予对对象属性的访问权限。因为这可能会导致属性数据的意外损坏。

可以通过限制对类外部对象属性的访问权限以及实现访问器和设置器方法来防止这些问题。

定义私有属性

python中的数据隐藏可以通过定义私有属性来实现。可以通过用两个下划线字符放在名称前来定义私有属性,如

self.__xx = xx

私有属性和方法只能在类内部访问。如果尝试在类外部访问私有属性,则会报错

访问器方法和设置器方法

访问器方法

为了使属性值在类外部可以访问,使用访问器方法。访问器(getter)方法只是一个返回对象属性值但不更改它的方法。通常称为getter方法。通常以"get"开头,下面是访问器方法的常规格式:

def get_attributedName(self):
    return self.attributeName
设置器方法

同样可以使用设置器(setter)方法,将值存储到对象属性的方法成为mutator方法。当需要更改或设置对象属性的值时,调用mutator方法。处理为对象属性设置值之外,它们还可以提供额外的验证,以便将数据分配给对象属性之前对其进行验证。设置器一般格式为:

def set_attributeName(self, newvalue):
    self.attributeName = newvalue

isinstance(object, class_name) 用于测试 object 是不是 class_name 类型
另外,可以将对象作为参数传递给函数。

三、继承和多态

1.继承

继承是一种机制,它允许我们通过在现有类的基础上添加新属性和方法。创建一个基于现有类(父类)的新类(子类),执行此操作时,子类将继承父类的属性和方法。

当想要创建非常相似的类时,继承确实会发光。需要做的是为它们在一个类(父类)中具有共同点的东西写代码。然后在另一个类(子类)为非常具体的东西写代码。这样可以避免复制大量代码。

基于父类创建子类,使用以下语法:

class Parentclass:
    # 父类的内容,包括属性和方法
class Childclass(Parentclass):
    # 子类的内容,包括属性和方法

在面向对象的术语中,当一个类 C 2 C_2 C2 是从一个类 C 1 C_1 C1 继承时,我们称类 C 1 C_1 C1 扩展类 C 2 C_2 C2 或类 C 2 C_2 C2 是从类 C 1 C_1 C1 派生的。

在python中,使用 s u p e r ( ) super() super() 方法来调用父类方法。这是设置父类中属性值所必需的。否则,当尝试使用getter或setter方法访问父类中定义的属性值时,将收到错误

多重继承

python 允许一次从多个类派生一个类,这被称为多重继承。一般格式为:

class Parentclass1:
    # 父类的内容,包括属性和方法
class Parentclass2:
    # 父类的内容,包括属性和方法
class Parentclass3:
    # 父类的内容,包括属性和方法
class Childclass(Parentclass1, Parentclass2, Parentclass3):
    # 子类的内容,包括属性和方法

2.多态性和方法覆盖

从字面上讲,多态性意味着采取各种形式的能力。在python中,多态性允许我们在子类中定义方法,其名称与父类中定义的名称相同。

当从父类继承的方法不太适合子类的情况时,必须在子类中重新实现方法。此过程称为方法覆盖。

在已经覆盖了子类中的方法中,将根据用于调用该方法的对象的类型调用该方法的版本。如果使用子类对象来调用重写的方法,则调用该方法的子类版本。另一方面,如果使用父类对象来调用重写的方法,则调用该方法的父类版本。

如果由于某种原因,仍想访问子类中父类的重写方法,则可以使用 s u p e r ( ) super() super() 函数调用,如:

class A:
    def  explore(self):
        # 主体
class B(A):
    def explore(self):
        super.explore() # 使用父类中的explore方法
    	# 子类explore主体也会运行

对象-基类

在python中,所有类都隐式地从object类继承。这意味着一下两个定义是等效的:

class Myclass:
    pass
class Myclass(object):
    pass

事实证明,该类object提供了一些具有前置和后置两个下划线的方法。这些下划线由所有类继承。下面是object类提供的一些重要方法。

1. __new__() # 该方法创建对象。创建对象后,它调用__init__()方法,初始化对象的属性。最后它将创建的对象
             # 返回给调用程序。通常不会重写该方法,但是如果要显著地更改对象的创建方式,则必须重写。
2. __init__()
3. __str__() # 该方法用于返回对象的格式良好的字符串表示形式。该方法的类版本返回一个字符串,其中包含类的
             # 名称及其十六进制的内存地址。可以重新定义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值