猪行天下之Python基础——8.1 类与对象(上)

简介: 内容简述:1、面相对象的理解2、类与对象3、继承4、组合5、对象相关的内置函数

1、面向对象的理解


考虑到部分读者可能没有接触过面向对象编程,所以先介绍下面向对象的一些特征,形成一个面向对象概念的基本认知,有助于后面具体的学习Python的面向对象编程。


① 对象引入


按照普通人的认知,对象就是我们日常生活中谈论到的男女对象。见过这样的问题:

“我没有对象是不是就没办法学习面向对象编程了?”


答案肯定不是,编程界有这样一句名言,“万物皆对象”,意思:把任何事物都看做一个对象。


所有的事物都具有两个特点:「有什么」和「能做什么」,举个例子:


老鹰有翅膀,能够飞翔。在面向对象看来,「老鹰」就是一个「对象」,「翅膀」是「属性」,「用来描述对象」,而「能飞翔」是「方法」,这就是「对象的功能」。


② 类的引入


自然界除了老鹰外,还有很多有翅膀的动物,比如燕子,天鹅等。它们都具有上面两个相似的特点,我们可以把这种「具有相同或相似性质的对象」进行抽象(抽取共性)从而形成一个类,比如这里的鸟类,可以写出这样的伪代码:


鸟类{
    属性:翅膀 = (不同的颜色,不同的形状)
    方法:飞翔(能否)
}


然后有个名字叫「类的实例」,类的一个个具体实现,其实就是「对象」,比如这里实例化不同的鸟的伪代码:


老鹰 = 鸟类(翅膀 = 长而宽阔,飞翔(能))
燕子 = 鸟类(翅膀 = 俊俏轻快,飞翔(能))
鸭子 = 鸟类(翅膀 = 较短,飞翔(否))


③ 类设计的要求和思想


  • 要求:高内聚,低耦合,从而提高对象的可复用性。


  • 思想:以对象为中心,先开发类,得到对象,再通过对象间的相互通信实现功能。


2、类与对象


对类与对象的概念有个大概的认知后,我们来开始学习Python中类与对象相关的语法。


① 定义类和实例


Python中使用class关键字定义类,我们来定义一个鸟类:


class Bird:
    """
    鸟类
    """
    kind = '动物'
name = "鸟"
    def __init__(self, name, wings):
        self.name = name
        self.wings = wings
    def can_fly(self, can):
        print("%s有 %s 的翅膀,%s飞翔" % (self.name, self.wings, '能' if can else '不能'))
if __name__ == '__main__':
    eagle = Bird("老鹰", "长而宽阔")
    duck = Bird("鸭子", "较短")
    eagle.can_fly(True)
    duck.can_fly(False)


运行结果如下


老鹰有 长而宽阔 的翅膀,能飞翔
鸭子有 较短 的翅膀,不能飞翔


② __init__初始化函数


在实例化对象的时候会自动调用,给该对象属性的值初始化,要注意: 不推荐使用类名.__init__()这种方式去调用初始化函数,以避免引起不必要的问题。


③ new构造函数


关于这个函数就涉及到Python经典类与新式类的概念了,在Python 2.x中,默认经典类除非显式的继承object类才是新式类。而在Python 3.x默认所有类都是新式类不用显式继承object类

 

新式类相比经典类增加了很多的内置属性,比如可以通过__class__获得自身类型等,还有这里的__new__()函数。而这个函数的调用时机在init__函数之前,作用是:可以调用其他类的构造方法或者直接返回别的对象来作为本类的实例

__new__(cls, *args,**kw),第一个参数表示要实例化的类,该参数在实例化的时候由Python解释器自动提供。另外要注意,__new()
函数,必须要有返回值,如果该函数没有成功返回cls类型的对象,是不会调用__init__()来对对象进行初始化!!!


初学者容易把这两个弄混,还是列出来帮助区分:


  • __init__():用于初始化新实例控制初始化过程,可添加一些属性,做些额外操作,发生在类实例被创建完后,它是对象级别的函数


  • __new__():用于控制生成新实例的过程,它是类级别的函数


④ 类属性与实例属性


类属性类的属性,当定义了一个类属性后,这个变量虽然归类所有但是类和实例都可以访问到类属性是类和实例的共有数据。当类属性和实例属性同名时,访问顺序是:实例属性 -> 类属性如果两个都不存在则会报错。比如下面这样的代码:


print("类访问类变量:%s" % Bird.kind)
print("类访问变类量:%s" % Bird.name)
print("实例访问类变量:%s" % eagle.kind)
print("实例访问同名变量:%s" % duck.name)


运行结果如下


类访问类变量:动物
类访问变类量:鸟
实例访问类变量:动物
实例访问同名变量:鸭子


实例属性则是与实例绑定的属性,可以通过 实例名.属性名 的方式调用,代表了实例的数据部分


相关文章
|
4天前
|
C++ Python
Python中的类与对象
Python中的类与对象
6 1
|
7天前
|
Python
在Python中,类的属性可以分为公有属性和私有属性
Python类包含公有和私有属性。公有属性可直接外部访问,如`person.name`,而私有属性如`_name`需通过getter/setter方法访问,如`person.getName()`和`person.setName()`。私有属性用于封装数据、隐藏实现细节,增强代码可维护性和安全性。封装能灵活修改内部实现,不影响外部;安全性防止外部非法修改数据;一致性确保所有数据操作在类内完成,简化代码并减少错误。
24 10
|
7天前
|
Python
【Python 基础】Python中的实例方法、静态方法和类方法有什么区别?
【5月更文挑战第6天】【Python 基础】Python中的实例方法、静态方法和类方法有什么区别?
|
7天前
|
存储 程序员 Python
Python中自定义类实例化数组的艺术
Python中自定义类实例化数组的艺术
8 1
|
7天前
|
程序员 Linux C++
Python中的WinForms类桌面应用程序开发
Python中的WinForms类桌面应用程序开发
23 4
|
10天前
|
Java 开发者 索引
Python基础语法:类笔记
本篇博文是把自己在学习python类的过程中自己理解和笔记,一点一点总结的写出出来,做一个总结,加深对面向对象编程的理解。
|
13天前
|
数据可视化 索引 Python
数据分享|Python用PyMC3贝叶斯模型平均BMA:采样、信息准则比较和预测可视化灵长类动物的乳汁成分数据
数据分享|Python用PyMC3贝叶斯模型平均BMA:采样、信息准则比较和预测可视化灵长类动物的乳汁成分数据
|
18天前
|
缓存 Java Python
Python 弱引用全解析:深入探讨对象引用机制!
Python 弱引用全解析:深入探讨对象引用机制!
22 3
|
19天前
|
运维 Shell Sentinel
第八章 Python可迭代对象、迭代器和生成器
第八章 Python可迭代对象、迭代器和生成器
|
19天前
|
运维 算法 Shell
第六章 Python类(面向对象编程)
第六章 Python类(面向对象编程)