面向对象的思维方式
-
面向对象,是一个编程思想,并不是一项技术,重在理解
-
面向过程:一步一步的完成功能:自上而下,逐步细化
-
面向对象:找到或者构造一个可以完成功能的主体:找到实体,功能完备
类和对象
-
类就是一系列拥有相同或相似功能的对象的集合,或者说类就是一系列事物的统称
-
对象就是类的具体的表现形式
1、手机是对象还是类? 2、苹果手机,是对象还是类? 3、iPhonex 手机是对象还是类? 4、我手里的苹果手机,是对象还是类?
类的定义
-
经典类
-
class 类名:
-
-
新式类
-
class 类名(父类名):
-
# 定义一个类: ''' 格式: # 经典类 class 类名: # 新式类 class 类名(父类名): ''' # 经典类 # 不由任何类派生,或者说不继承任何类 class student: pass # 为了保证代码结构完整,在类下边必须书写表达式,如果没有使用pass占位 # 新式类 # 括号内就是我们的父类,也就是存在一定的继承关系 # 有些地方称其为object的派生类 class teacher(object): # pass ... # 为了保障代码结构完整,也可以使用...来进行占位
类的实例化
-
类的实例化又叫做创建对象
-
类中实例化后的对象可以调用类中的方法
-
一个类理论上可以实例化无数个对象
-
格式: 类名()
# 类的实例化又称为创建对象 # 定义一个类 class Student(object): # 定义方法.定义方式和函数定义类似 def study(self): print('我在听直播课,贼有意思,就是学习非常不努力我也能听懂') def eat(self): print('我在吃脑白金,补补脑子继续学习') # 类的实例化(创建对象) # 格式: 类名() s1 = Student() # 我们可以直接打印对象,得到的是其所对应的类和所在的内存地址 print(s1) # <__main__.Student object at 0x7f9be20848e0> # 也可以打印对象的类型,其实就是我们创建对象所使用的类 print(type(s1)) # <class '__main__.Student'> # 实例可以调用实例方法 s1.study() s1.eat() # 理论上类可以创建无数个实例对象 s2 = Student() print(s2) # 类名的定义要使用大驼峰命名法 # 类名严格区分大小写,类名遵循标识符的命名规则 # class ChineseStudent(): # pass # # s3 = Student() # s4 = student() # s3.eat() # s4.eat()
self
-
self就是讲调用方法的实例传入方法内部,在方法内部可以调用实例的属性和方法
# 在类的内部定义方法的时候,自动传入一个self # 在调用实例方法时,不需要对self 进行传值 # self到底是什么?有什么用? class Student(object): def study(self): # 由于s1和self指向同一块内存空间,所以其必为同一个对象 # 也就是说在对象调用方法时会将对象本身传入方法内部进行使用 print(self) # <__main__.Student object at 0x7fa2654848e0> print('我要学习了,谁也不要打扰我,我知道你们为了超过我不择手段,但是没有用') def eat(self): # self 有什么作用呢? # 可以在方法内部调用实例所拥有的属性或者方法 print('我要吃饭了吃完就学习') self.study() # 实例化对象 s1 = Student() print(s1) # <__main__.Student object at 0x7fa2654848e0> s1.study() s1.eat() # 我们为什么要讲对象传入进去呢? # 方法时定义在类的内部的,所有的对象共有一个类,所以我们再调用方法的时候,需要传入我们调用方法所使用的类 # s2 调用study方法时所指向的空间和s1无关所以两个对象指向不同的内存空间,修改一个,另一个不发生变化 s2 = Student() s2.study()