前置疑问
Q1 面向对象和面向过程有什么区别?两者之间有什么联系?
Q2 怎么才算是面向对象呢?
Q3 我该如何实现面向对象呢?
Q4 创建类对象和实列对象的内存分析是什么样子的?
Q5 面向对象有三大特性:封装、继承、多态。如何实现这三大特性?
学习内容
1、面向对象和面向过程的区别
2、类的定义,__init__和__new__方法
3、实例属性和实例方法
4、类对象、类方法、类属性
5、__del__自动删除没有没引用的对象,__call__实例对象可以像调用函数一样使用
学习时突发疑问
Q6 实例可以调用类的方法吗?实列对象怎么能调用类方法的?
Q7 为什么python中方法不能重载
学习产出
1、面向对象的由来
A1
面对一个复杂问题,比如造车,一步一步来,不能保证每个步骤的正确性和衔接问题。应该先分析一个车的构成,由车胎、车架、引擎、系统等组成而来。而在分析这个过程中,对象就产生了,即这些车胎、车架、引擎,系统这些名词。我们知道了对象,然后具体一步一步生成这个对象,这个实现的过程就是一个过程,对象全部生成了,最后组装,一辆车就造成了。
一句话:面向对象宏观分析问题,面向过程微观具体实现。
2、面向对象的具体实现
A2和A3
2.1 简单定义一个类并生成对象
class Student:
def __init__(self,name,score):
self.name = name
self.score = score
def say_score(self):
print("{0}的分数是:{1}".format(self.name, self.score))
s1 = Student("xiaoming", 80)
s1.say_score()
s1.age = 24
s1.salary = 20000
print(s1.salary)
print(s1.age)
print(dir(s1))
print(s1.__dict__)
print(isinstance(s1,Student))
查看这段代码知道一下信息:
- 创建对象之前需要一个类。
创建类的格式:
class 类名:
类体
类名满足:驼峰原则
这段代码中类体有这几个部分组成:
- 构造方法__init__
构造方法__init__初始化对象,方法的第一个参数是传入对象本身的地址,参数名习惯用self表示,且第一个参数必须是这个。name和score 表示初始化对象时,赋予的值。self.name = name 和 self.score = score是实例属性。系统中默认有__init__方法,如果我们定义了__init__方法,则系统就不创建了。
- say_score
该方法属于实例方法
-
我们根据这个类去生成一个类的实例,这个实例就是对象。
生成对象的语句 :s1 = Student(“xiaoming”, 80) 。s1就是对象,这个对象里面有name,score属性和say_score方法。也可以给这个对象加属性 s1.age = 24 为s1这个对象新增加属性age。系统中默认有__new__方法创建新的对象,因此不用写 -
运行结果
完整显示内容
xiaoming的分数是:80
20000
24
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name', 'salary', 'say_score', 'score']
{'name': 'xiaoming', 'score': 80, 'age': 24, 'salary': 20000}
True
A4
4. 底层内存解析图
图片由python tutor生成
A6
3 类属性、类方法、类对象
class Student:
#类属性
school = "TsingHua"
count = 0
@classmethod
def print_schname(cls):
print("学校名字:", Student.school)
def __init__(self,name, age, id):
'''初始化实例对象'''
self.name = name
self.age = age
self.id = id
Student.count = Student.count + 1
def say_id(self):
print("{0}的学校是:{1}".format(self.name, Student.school))
print("{0}的学号是:{1}".format(self.name