面向对象
首先,所有的程序都是由数据与功能两部分组成的。
因此编写程序的本质就是定义一系列的数据,然后定义一系列对应的功能对其操作
在我们学习面向对象之前,数据与功能是分开的
# 数据:name、age、sex
name='lili'
age=18
sex='female'
# 功能:tell_info
def tell_info(name,age,sex):
print('<%s:%s:%s>' %(name,age,sex))
# 此时若想执行查看个人信息的功能,需要同时拿来两样东西,一类是功能tell_info,另外一类则是多个数据name、age、sex,然后才能执行,非常麻烦
tell_info(name,age,sex)
如上所示,在数据与功能还较少的时候我们可能还并不能感受到杂乱,但是一旦数据一多,整体就会显得非常的杂乱无章,这种时候我们就需要用到面向对象的思想。
面向对象简而言之就是一种将相关连的数据以及功能放入同一个容器中
面向对象需要做的只是考虑有哪些事物是相关连的,然后将他们装如一个容器中,具体功能的实现以及逻辑顺序并不需要考虑。
面向对象的优缺点:
优点:可扩展性强
缺点:编程复杂高,容易出现过度设计
类与对象
当我们实例化一个类的时候,这个类就变成了对象(类是概念,只要在实例化对象之后,python就会为这个实例化对象在内存中开辟一个内存空间),可以理解成套娃的形式
在python中有为我们提供一种语法来为面向对象这种思想服务。class 类名:
class Student:
#类在被调用的时候最先执行的就是初始化操作,其实在初始化的时候会有一个隐藏的参数被赋值给self,也就是对象的内存地址。
#类方法通过这个被赋予的内存地址与外界的初始化对象进行绑定,然后将一些参数保存至该内存地址中
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
print(id(self))
def learn(self):
print('aaa')
student = Student('施',18,'男')
print(id(student))
>>>16494992
>>>16494992
#绑定的函数对像会对自己空间的内存地址进行寻找,寻找不到就会到外界的类的内存空间中去寻找
class Student:
name = "egon"
school = '金'
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
print(id(self))
def learn(self):
print('aaa')
student = Student('施',18,'男')
print(student.name)
print(student.school)
>>>施
>>>金
类即类型
python3中的所有数据类型本质都是一个类
例如list:
#我们新建一个列表
a=[1,2,3]
#他的本质其实是a = list([1,2,3]) ,与我们上文的初始化对象是一致的
两个类之间的交互例子
当我们学会了如何去定义一个类后,我们便可以去考虑如何将两个类进行交互,如下所示
class Bank:
def __init__(self,money=1000):
self.money = money
def get_money(self,user_money,enemy):#传入给银行的钱与用户的对象
self.money += user_money
enemy.money -= user_money
class User:
def __init__(self,money=1000):
self.money = money
bank = Bank()
user = User()
bank.get_money(100,user)
print(user.money)
print(bank.money)
>>>900
>>>1100
总结
面向对象是一种思想,这是凌驾于任何一种语言之上的东西,若是学会了这种思想,哪怕一种编程语言没有为你提供专门的面向对象的语法,你也可以通过自己的方法写出面向对象的形式