1.面向对象简介
- Python是一门面向对象的编程语言,在Python中所有数据类型都被视为对象
- 所谓面向对象的语言 ,简单来说就是语言中的所有操作都是通过对象来进行的,对函数进行分类和封装,让开发更快,更好,更强…
- 面向对象的基本哲学:
- 世界由具有各自运动规律和内部状态的对象组成,对象之间的相互作用和通讯构成了世界
- 唯一性:世界上没有两片相同的叶子,也没有两个相同的对象
- 分类性:分类是对现实世界的抽象
- 面向对象的三大特性:封装、继承和多态
- 对于面向对象的编程语言,关注的是对象,而不注重过程,对于面向对象,一切皆对象
- 面向对象的编程思想,是把所有功能统一保存到相应的对象中,要使用某个功能,直接找到对应的对象即可
- 面相对象与面向过程的不同:
- 面向对象的编码方式易于维护,比较容易阅读,容易复用。但是编写的过程中不大符合人们的常规思想,编写相对麻烦。
- 面向过程将程序分解成一个步骤,往往适用于某个功能,如果实现别的功能,往往复用性较低,但是这种编程思想比较符合人们的常规,容易理解。
2 类(class)
- 我们之前学习的都是Python的内置对象,但是内置对象不能满足我们的需求,常常需要自定义一些对象
- 类 可以简单理解为一张图纸,在程序中需要根据类创建对象
- 类 是用来描述具有相同属性和方法的对象的集合。它定义了该集合中每个对象共有的属性和方法。对象就是类的实例
- 如果多个对象通过一个类创建的,我们称这些为一类对象
- 语法:
class 类名([父类]):
代码块
- 类变量(属性):类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体(方法)之外。类变量通常不作为实例变量使用,类变量也叫做属性。
- 实例变量:定义在方法中的变量,只属于当前实施的类
- 实例化:创建一个类的实例,类的具体对象
- 可以向对象中添加变量,对象中的变量称之为属性。 语法: 对象.属性名 = 属性值
- isintance 检查一个对象是否是一个对象的实例
class MyName():
name = 'person'
print('这是自定义的类')
mc = MyName()
mc.name = 'person'
print(mc.name)
- 类也是一个对象,类是用来创建对象的对象
# 定义一个gender类
class gender():
print('这是一个自定义的类')
mc = gender()
print(mc, type(mc))
print(gender, type(gender))
其中 mc 就是gender的实例对象,而gender是type的实例对象
3. 类的定义
- 类的命名规范:自定义的类,类的名字要用大写字母开头,一般使用大驼峰命名法
- 类包含的属性和方法:
- 一对象的特征成为“属性”,一个对象的行为成为“方法”。 属性实际上就是变量,方法就是函数,通过调用这些函数来完成某些方法
- 调用的语法: 对象.方法名()
- 方法调用与函数调用的区别:函数调用在调用的时候,有几个形参就传递几个实参。如果是方法调用,默认传递一个参数。所以方法中必须定义一个形参。
- 在类的代码中,我们可以定义变量和函数:
- 在类中定义的变量,将会成为所有实例的公共属性,所有实例都可以以 对象.属性名()的形式访问
- 在类中定义的函数,我们成类中定义的函数为方法。该方法通过该类的实例访问,以对象.方法名()的形式访问
class MyClass:
"""
这是一个简单的类
"""
a = 12345
def demo(self):
return ('Hello World')
# 将此类实例化
x = MyClass()
name = x.a
name1 = x.demo()
print('这是此类的属性', name)
print('这是此类的属性', MyClass.a)
print('这是此类的方法', name1)
- 在未实例化类(x=MyClass())时,只定义了对象的属性和方法,此时还不是一个完整对象,将定义的这些成为类。需要使用类来创建一个真正的对象,这个对象就叫做这个类的实例,也叫做实例对象(一个类可以有无数个实例)
- 创建一个对象也叫做类的实例化,即x=MyClass()(此时的X也叫做类的具体对象),一定要注意后面的小括号
- 另外赋值操作并不是必须的,但是如果给没有创建好的实例对象赋值,那么这个对象无法使用,因为没有任何引用指向这个实例
4. 参数self
4.1 属性和方法
- 类中定义的属性和方法都是公共的,任何实例对象都可以访问
- 属性和方法的查找流程:
- 当我们调用一个对象的属性时,解析器会在当前对象(实例)中寻找该属性,如果有,则直接返回当前对象的属性值,如果没有,则会在类对象中寻找该属性,如果有,则直接返回,如果没有,则报错
- 类对象和实例对象都可以保存属性和方法:
- 如果这个属性(方法)是所有的实例共享的,则应该保存到类对象中
- 如果这个属性(方法)是某个实例独有的,则应该保存到实例对象中
- 一般情况下 ,属性保存到实例对象中,而方法保存到类对象中
class MyClass:
"""
这是一个简单的类
"""
a = '钢铁侠'
def demo(self):
return ('Hello World')
# 将此类实例化
x = MyClass()
x.a = '蜘蛛侠'
name = x.a
name2 = x.a
# name1 = x.demo()
print(x.a)
print(name)
print(name2)
4.2 self
- self在定义时需要定义,在需要调用时自动传入
- self 名字并不是规定死的,但是最好使用 self
- self 总是指调用时的类的实例
class MyClass:
def fn(self, name):
self.name = name
def demo(self):
# print('我叫{}'.format(self.name)) # 我叫A
# 我叫B
# 我叫C
new_name = ('我叫{}'.format(self.name))
return new_name
# 生成三个实例对象
a = MyClass()
b = MyClass()
c = MyClass()
a.fn('A')
b.fn('B')
c.fn('C')
print(a.demo())
print(b.demo())
print(c.demo())
# 我叫A
# None
# 我叫B
# None
# 我叫C
# None
从上面看出MyClass类生成了三个实例 a,b,c 。三个实例在调用fn()方法时,通过self 将’A’,‘B’, 'C’ 传给了name。 在调用demo()方法时,也是通过self 找到究竟是哪个对象在调用该方法