-
2. 类
-
- 2.1 类的概述
-
2.2 类的定义
-
2.3 属性和方法
-
- 2.3.1 小引
-
2.3.2 属性
-
2.3.3 方法
-
2.4 self参数
-
3. 特殊方法
-
4.封装
-
- 4.1封装,私有属性,隐藏属性
-
4.2 getter()与setter()
-
5. property装饰器
-
6. 继承
-
- 6.1 继承概述 与 object类
-
6.2 方法重写
-
6.3 super()方法
-
6.4 多重继承
-
7. 多态
-
8. 属性和方法
-
- 8.1 属性
-
8.2 方法:
-
- 8.2.1 实例方法
-
8.2.2 类方法
-
8.2.3 静态方法
-
9.单例模式
-
- 9.1 __new()__方法
-
9.2 单例模式的实现
==============================================================================
python是一门面型对象的的编程语言,所谓面向对象,简单地来理解就是语言中所有的操作都是通过对象来进行的。
使用面向对象的编程语言,我们关注的是对象,而不注重过程;对于面向对象,一切皆对象。
比如“对于如何把大象放进冰箱这个问题”,在面向对象编程中,我们只需要考虑大象和冰箱两个对象就足够了,然后步骤如下:①打开冰箱。②把大象放进去。③关上冰箱门。至于怎么放进去的,这不是我们关注的重点。
因为冰箱和大象两个对象所持有的属性和方法,或者说是我们通过调用封装好的函数,足以满足我们的需求。甚至python也许就已经存在过了形如:
def 把大象放冰箱() :
bulabulabula…
return(‘已经放进去了。’)
的函数,我们只要找到大象和冰箱两个对象,然后直接调用相关函数或者方法就可以把问题解决了。而我们不用过于关心这个函数是怎么执行的。
与之相对的另一种编程思想,即面向过程,这个问题在面向过程的编程语言中,我们则会将程序分解为一个一个的步骤,通过对每个步骤的抽象来完成程序。面向过程的方式更符合人类的思维,编写起来比较容易。
面向对象的编程思想,将所有的功能都保存到对应的变量中。在python中,你想使用一个东西,你必须先创建一个这样的对象。要使用某个功能,直接找到对应的对象即可。这种编码方式比较容易阅读,并且易于维护,容易复用。但是编写过程不太符合常规思维,编写相对麻烦。
(比如对于一个第三方库模块导入的函数对象,你如果不了解其功能或使用方法,你的编程就很难继续。同时面向对象编程也是因为这些复杂的函数对象的组合才显得更方便更强大。)
===========================================================================
python的内置对象并不都能满足我们的需求,所以我们在开发中经常要自定义一些对象。类可以简单理解为是一张图纸,是对象的图纸。在程序中我们需要根据类来创建对象。
比如我们用list()函数创建出一个列表,用tuple()函数创建出一个元组,这些都是在python内置库中已经定义好的内置对象,所以我们才能直接使用。而不能单纯的理解为这是平台的设定。
我们也称对象为类的实例(instance),如果多个对象是通过一个类来创建的,我们就成这些对象是一类对象。
此外,类本身也就是一个对象,类是用来创建对象的对象。
语法
class MyClass(): # 定义一个类,类名命名为MyClass,也即创建了一个类对象。
pass
mc = MyClass() # 创建一个实例对象(类的实例化)
mc1 = MyClass()
类和对象都是对我们生活中现实事物的抽象
- isinstance() 用来检测实例对象是否是由给定类对象创建出来的
print(isinstance(mc, MyClass))
输出结果:
2.3.1 小引
-
一个对象可以分为两部分:①属性②方法
-
在类代码快中,我们可以定义变量和函数:
变量会成为该类实例的公共属性,所有的该类的实例都可以通过 对象.属性名的形式访问。
函数会成为该类实例的公共方法,所有的该类的实例都可以通过 对象.方法名的形式访问。
2.3.2 属性
-
类对象是可以添加属性的,语法为:对象.属性名 = 属性值。
-
id和type是每个对象自带的属性,即存储。对象一被创建,就有id和type属性。
print(id(mc), id(mc1))
输出结果如下:
print(type(mc))
输出结果如下:
2.3.3 方法
-
调用方法语法:对象.方法名()
-
方法调用 和 函数调用 的区别:
如果是函数调用,调用的时候有几个形参,就会传入几个实参。
如果是方法调用,默认传递一个参数。所以方法中至少得有一个形参。
-
self 在定义的时候需要定义,但是在调用时会自动传入。
-
self 的名字并不是规定死的,但是是约定俗成的。所以一般最好使用self,而不是别的。
-
self总是指调用时类的实例。
现举代码实例如下:
class Person():
name = ‘张三’
age = 18
identity = ‘学生’
def speak(self): # self就等于任何调用我这个方法的对象本身
print(‘你好,我是{},{}岁的{}’.format(self.name, self.age, self.identity))
p1 = Person()
p1.name = “马保国”
p1.age = 65
p1.identity = ‘老同志’
p1.speak()
输出结果:
==============================================================================
在类中可以定义一些形如__xxx__的方法,称为特殊方法,也称魔术方法。特殊方法不需要我们调用,会在特定的时候自动调用。
- 掌握下边这种定义类写法,方可实现在创建类的实例对象的时候直接传入属性。
class Person():
name = ‘张三’
age = 18
identity = ‘学生’
特殊方法 init,类的对象被创建时, __init__就会被调用
def init(self, name, age, identity):
self.name = name
self.age = age
self.identity = identity
print(‘hello’) # 实例对象一被创建,"hello"就被输出。
这样写,再创建类的对象的时候,name和age都将成为必传参数。缺少则 __init__会无法运行,导致报错。
这里不能用不定长参数,那样没有任何意义。
def speak(self): # self就等于任何调用我这个方法的对象本身
print(‘你好,我是{},{}岁的{}’.format(self.name, self.age, self.identity))
p1 = Person(“马保国”, 65,“老同志”)
p1.speak()
==========================================================================
封装是面向对象三大特征之一。我们需要一种方式来增强数据的安全性,这种方式就是封装。
封装是指隐藏对象中一些不希望被外部访问到的属性或方法。具体方式为,在属性名前加入一个下划线,表示不可直接访问,但仍可手动访问,只是提醒不可修改;在属性名前加两个下划线表示隐藏属性。
示例:
class Person():
def init(self, name, age, identity):
self.name = name
self._age = age
self.__identity = identity
这样写,再创建类的对象的时候,name和age都将成为必传参数。缺少则 __init__会无法运行,导致报错。 # 这里不能用不定长参数,那样没有任何意义。
def speak(self): # self就等于任何调用我这个方法的对象本身
print(‘你好,我是{},{}岁的{}’.format(self.name, self._age, self.__identity))
p1 = Person(“马保国”, 65,“老同志”)
print(p1.name)
print(p1.age)
print(p1.identity)
运行结果如下:
我们可以看到,name依然可以直接访问,但是前边加了一个下划线的age和加了两个下划线的identity属性已经不能直接访问了。
- 对于前边加了一个下划线的属性age,我们使用p1._age的方式依然可以访问age属性的。
但是对于前边加了两个下划线的属性identity,我们却不能再使用p1.__identity来访问了。否则会有如下报错。
- 但是对于这样的属性,并不是没有办法访问。
我们可以使用固定语法:_类名__属性名 的形式进行访问。
如 p1._Person__identity
(类名前加一个下划线,类名与属性名之间加了两个下划线)
即:
这样就访问成功了。
- 该如何解释这一系列情况呢?
可以这样来理解。
-
一般情况下,加_的都是私有属性。没有特殊情况下不要修改私有属性。封装就是这样保障数据安全的。这种”不要修改“是一种约定俗成,不意味着不能修改,只是对编程者的一种提醒。毕竟所有的属性,只要你想修改,都还是受人为控制的。
-
加一个_后,只是相当于传入属性值后,把原先的属性名前加了一个下划线,故可以通过“_属性名”的形式访问。
-
而对于加了__(两个下划线)的隐藏属性,本质上只不过是Python自动为属性改了一个名字,即 _类名__属性名 。这样我们就常常把它描述为“私有属性不能通过对象来获取,只能在类的内部访问。” (一句常见的概述)但是,上边的例子我们也看到了,使用p1._Person_identity的方式确实可以说是通过对象访问到了属性值。但是这句话本身是没有问题的,之所以这么说,就是我们对于封装这一概念的一种认同与使用,我们约定俗成不乱操作封装过的属性值,以保障数据安全,我们只是不再可以通过原来的对象名字来获取该对象了。
-
协定开发我们一般使用私有属性(一个下划线),而一般不用隐藏属性。
我们也可以给类提供上getter()和setter()方法
getter() 用于获取对象中指定的属性
setter() 用于设置对象中的属性
示例如下:
class Person():
def init(self, name, age, identity):
self.name = name
self.__age = age
self._identity = identity
getter方法 提供给你访问这个属性的方法 # 协定开发一般用 私有属性
def get_identity(self):
return self._identity
setter方法 提供给你修改这个属性的方法
def set_identity(self, identity):
self._identity = identity
def speak(self):
print(‘你好,我是{},{}岁的{}’.format(self.name, self.__age, self._identity))
逐句输入下边代码,观察结果,以感受其用法逻辑。
p1 = Person(“马保国”, 65,“老同志”)
p1.get_identity()
p1.speak()
p1.set_identity(‘武林高手’)
p1.get_identity()
p1.speak()
结果展示如下:
- 增加getter()和setter()方法,可以很好地控制属性是否是只读的。
=====================================================================================
我们可以用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。
具体示例如下:
class Person():
这里,name属性是私有属性,不可读也不可改
def init(self, name):
self._name = name
getter方法 提供给你访问这个属性的方法
@property
def name(self):
return self._name
这样,name属性就转为了只读,不可改。可以通过相同名称的方法:name来查看name属性。
如果想再把不可改的属性改为可改属性,则:
setter方法 提供给你修改这个属性的方法
@name.setter
def name(self, name):
self._name = name
下边 逐句进行测试
p1 = Person(‘马保国’)
print(p1.name) # 可以通过p1.name 读取name属性了。
p1.name = ‘蔡徐坤’ # 可以这样修改p1的name属性了。
print(p1.name) # name属性已被更改
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
HnSQiBT-1711802034467)]
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。