文章目录
面向对象编程是将数据和操作数据相关的方法封装到对象中。
面向对象&面向过程
面向过程:关注程序的逻辑流程,是一个执行者思维,适合编写小规模程序,更适合一个人的工作,关键是找动词
面向对象:适合分工协作,每个人造不同的零件最后组装,适合从宏观上把握,从整体上分析整个系统,但是具体到实现部分的微观操作,仍然需要面向过程的思路去处理,关键是找名词。
对象的进化
随着编程面临的问题越来越复杂,编程语言本身也在进化,从主要处理简单数据开始,随着数据变多进化"数组";数据类型变复杂,进化成了"结构体";处理数据的方式和逻辑变复杂,进化出了“对象”。
对象:就是将不同类型的数据,方法(即函数)放在一起,就是对象。
类的定义
如果把对象比作一个饼干,那么类就是制造这个饼干的模具,所以对象就有同样的属性。


一个典型的类的结构
# 定义类的时候,名字首字母大写
class Student:
# 定义属性,名字固定,均为__init__
# self 必须位于第一个参数,而且必须有
def __init__(self, name, score):
self.name = name
self.score = score
# self 必须位于第一个参数
def say_score(self):
print("{0}的分数是:{1}".format(self.name, self.score))
# 类名+括号代表相当于调用的是属性,就是第一个__init__
s1 = Student('Di', 18)
s1.say_score()
运行结果
构造函数__init__()
之前提过一个对象包括id,type 和value ,那么value 细分为属性(attribute)和方法(method)。
__init__方法要点
- 名称固定,必须是__init__
- 第一个参数固定,必须是:self。self指的是刚刚创建好的实例对象
- 构造的目的就是为了初始化对象的实例属性,如下代码就是初始化实例。
def __init__(self, name, score):
self.name = name
self.score = score
可以理解为这一步是为了定义参数:把形参加到括号里面,在下面定义参数。
通过类名(参数列表)来调用构造函数
调用后,将创建好的对象返回给相应的变量。
比如 s1 = Studen(‘Di’,18)包括了下列两步:
- new() 方法:用于创建对象,但我们一般无需重新定义该方法.
- int()方法:初始化创建好的对象。初始化是指给对象里面的属性赋值。
实例属性

刚开始定义的是 属性,后来的的say_score定义的是方法。
# 定义类的时候,名字首字母大写
class Student:
# 定义属性,名字固定,均为__init__
# self 必须位于第一个参数,而且必须有
def __init__(self, name, score):
self.name = name
self.score = score
# self 必须位于第一个参数
def say_score(self):
print("{0}的分数是:{1}".format(self.name, self.score))
# 类名+括号代表相当于调用的是属性,就是第一个__init__
s1 = Student('Di', 18)
print(s1.name)
# 调用方法属性
s1.say_score()
# 增加属性:年龄和工资
s1.age = 32
s1.salary = 3000
print(s1.salary)
# 再增加一个对象
s2 = Student('Di1', 30)
print(s2.name)
# 删除对象,里面的属性也会随之消失
del s1
s1.name
运行结果
Di
Traceback (most recent call last):
Di的分数是:18
3000
File "D:/PycharmProjects/MyTest/Day_7/learn_class.py", line 37, in <module>
Di1
s1.name
NameError: name 's1' is not defined
实例方法
实例方法是从属于实例对象的方法,实例方法的定义格式如下:
def 方法名(self[形参列表]):
函数体
方法的调用格式如下:
对象.方法名()
要点
- 定义实例方法时,第一个参数必须为self。和前面一样,self指当前的实例对象。
- 调用实例方法时,不需要也不能给self传参,但是可以增加其他的参数。
还是上面的例子:调用函数的两种写法
s1.say_score()
Student.say_score(s1)
运行结果
Di的分数是:18
Di的分数是:18
函数和方法的区别
- 都是用来完成一个功能的语句块,本质一样
- 方法调用时,通过对象来调用,方法从属于特定实例对象,普通函数没有这个特点。
- 直观上看,方法定义时需要传递self,函数不需要
其他
- dir()可以获得所有对象属性
print(dir(s1))
结果
['__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__', 'name', 'say_score', 'score']
- obj.__dict__对象的属性字典
print(s1.__dict__)
运行结果
{
'name': 'Di', 'score': 18}
- pass 空:表示还没想好怎么写,那就暂时不写
class Man:
pass
- isinstance(对象,类型) 判断“对象”是不是“指定类型”
# 判断s1是不是Student的实例对象,如果是的话就是True,如果有调用的话那就可以是。
print(isinstance(s1,Student))
总结
- 类是一个对象,这个对象也有自己的固有属性,但是在值那里面还分为了属性和方法
- 定义类的话,要先学会定义属性,然后定义方法,学会如何调用(赋属性,用方法)
- 其他是用来判断类的属性等。
类对象
class Student1:
pass
print(id(Student1))
print(type(Student1))
stu = Student1
stu()
print(id(stu))
运行结果
2377311793064
# 查找这个类的type 指的是这个type的类型是一个模具,是一个饼干类型的
<class 'type'>
# 把Student 赋值给Stu,那么两者的id值是一样的
2377311793064
类属性和类方法
类属性
区别实例方法,实例对象,实例属性,类属性
# 定义类的时候,名字首字母大写
class Student:
company = 'SXT' # 类属性
count = 0 # 类属性
def __init__(self, name, score):
self.name = name # 实例属性
self.score = score
Student.count += 1
# self 必须位于第一个参数
def say_score(self): # 实例方法
print('我的公司是:', Student.company)
print("{0}的分数是:{1}".format(self.name, self.score))
s1 = Student('Di', 18) # s1是实例对象,自动调用__init__()方法
s2 = Student('Di1',

本文详细介绍了Python的面向对象编程,包括面向对象与面向过程的区别、类和对象的定义、构造函数__init__()、实例属性和方法、类属性和类方法、特殊方法如_del_、_call_以及垃圾回收机制、继承、多态等概念。此外,还讨论了属性的封装、私有化、property装饰器以及设计模式中的工厂模式和单例模式。
最低0.47元/天 解锁文章

530

被折叠的 条评论
为什么被折叠?



