今天我们用Python来找对象
找对象第一步,
1、理解什么是对象
2、理解类和对象
3、掌握__init__
4、self的那些事
一、什么是面向对象?
面向过程:之前我们学习过函数式编程,,也就是面向过程编程(pop),是一种是事件为中心的编程思想。就是分析出解决问题所需的步骤,然后用函数把这些步骤实现,并按顺序调用。
例如:举个例子:汽车启动,汽车运行、汽车到站。汽车启动是一个事件,汽车到站是另一个事件,面向过程编程(pop)的过程中我们关心的是事件,而不是汽车本身。针对上述两个事件,形成两个函数,之后依次调用。
面向对象:面向对象编程(oop),对于上面汽车的例子,这个时候我们的关注点不再是汽车的发动,到站这些行为,我们的关注点在于汽车本身,也就是我们的研究对象是汽车,汽车具有这些行为过程。
也就是说,两者的区别在于关注点不同,面向过程,注重的是分解,面向对象、注重的是一个整体。
自己的拙见:不对的地方,后台留言指正。
二、类和对象
类即类别、种类,是面向对象设计最重要的概念,对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体
*万事万物皆可是对象,一个人可以是对象,一棵树,一只狗,一辆车,这些都可以是对象。
以汽车为例,启动,运行,到达
以函数式编程来实现这个过程,分三步,定义三个函数。
def start_up():print('启动汽车')def run():print('汽车运行中')def arrive():print('汽车到达')start_up()run()arrive()# 启动汽车# 汽车运行中# 汽车到达
面向对象编程(类)来实现
类的定义使用关键字class
类的属性
类具有数据属性和函数属性
#定义一个类,类的首字母大写,PE8风格class Car():#定义实现这些行为的函数(类属性)def start_up(self):print('启动汽车')def run(self):print('汽车运行中')def arrive(self):print('汽车到达')car = Car()car.start_up()car.run()car.arrive()# 启动汽车# 汽车运行中# 汽车到达
我们定义的这些函数就是类的 函数属性
例:定义一个学校
学校有名字,所在地址,建立时间等
学校是用来干嘛的? 教书育人(学习),搞研究。
class School():def __init__(self, name,address, establish_time):self.name = nameself.address = nameself.establish_time = establish_timedef learn(self):print('学习')def research(self):print('研究')
在这个例子中定义了 数据属性,name,address
函数属性 learn,reseach
关于数据属性,和函数属性,后面会详解。
这里还看到一个 __init__函数(两个下划线)
__init__用来初始化类的数据属性
然后我们定义了两个函数,每一个函数中必须有一个参数(指定为 self)
下面我们来详细讲解一下__init__,和 self。
三、详解__init__
刚才说到,__init__ 是用来初始化数据属性的,
当然我们可以使用其它方法来初始化数据属性
** __init__ 不能有返回 ,就算是返回空也不行
这里以人作为对象来讲解
人:名字,年龄,性别
第一种
class Person():name = '老王'age = '18'gender = '男'def run(self):print("{}是个{}生,今年{}岁".format(self.name,self.gender,self.age))#实例化一个对象p1 = Person()p1.run() #老王是个男生,今年18岁#再实例化一个对象p2 = Person()p2.run() #老王是个男生,今年18岁#但是有个问题,不可能每一个人的#名字都叫 老王#修改一下 p2 的数据属性p2.name = '隔壁老王'p2.age = '33'p2.gender = '女'p2.run() #隔壁老王是个女生,今年33岁
方法二
class Person():name = '老王'age = '18'gender = '男'def run(self):print("{}是个{}生,今年{}岁".format(self.name,self.gender,self.age))#先实例化两个对象p1 = Person()p2 = Person()#这里可以为实例化对象绑定一个函数属性def init(self, name, age, gender):self.name = nameself.age = ageself.gender = gender#这里的self传入的参数应该是 实例化后的对象init(p1, '老王',24, '男')init(p2, '老刘', 66,'男')p1.run() #老王是个男生,今年24岁p2.run() #老刘是个男生,今年66岁
方法三
class Person():name = '老王'age = '18'gender = '男'def init(self, name, age, gender):self.name = nameself.age = ageself.gender = genderdef run(self):print("{}是个{}生,今年{}岁".format(self.name,self.gender,self.age))#先实例化两个对象p1 = Person()p2 = Person()#这里的self传入的参数应该是 实例化后的对象p1.init('老王',24, '男')p2.init('老刘', 40,'男')p1.run() #老王是个男生,今年24岁p2.run() #老刘是个男生,今年40岁
方法四
class Person():name = '老王'age = '18'gender = '男'def __init__(self, name, age, gender):self.name = nameself.age = ageself.gender = genderdef run(self):print("{}是个{}生,今年{}岁".format(self.name,self.gender,self.age))#先实例化两个对象p1 = Person('隔壁老王',24, '男')p2 = Person('老刘', 40,'男')p1.run() #隔壁老王是个男生,今年24岁p2.run() #老刘是个男生,今年40岁
方法一
每实例化一个对象就需要修改一次,量大了就不好玩了
方法二
改用了绑定函数的方法来初始化,可以直接传入参数,稍微简单了点。
方法三
和第二种差不多,只是将函数在定义类的时候绑定了
方法四
和第二种差不多,但是这里初始化不需要自己调用,实例化的时候会自己调用。
四、如何理解 self
不难发现,我们定义的每一个类的函数方法,都有一个self的参数,这个参数有什么作用呢?self用于将属性绑定在这个类,不论是函数属性还是数据属性。
直接通过代码学习
class Person():name = '老王'age = '18'gender = '男'def __init__(self, name, age, gender):self.name = nameself.age = ageself.gender = genderdef run(self):print("{}是个{}生,今年{}岁".format(self.name,self.gender,self.age))def run_test():print("{}是个{}生,今年{}岁".format(self.name,self.gender,self.age))#先实例化两个对象p1 = Person('隔壁老王',24, '男')p2 = Person('老刘', 40,'男')p2.run_test()
这里报错,说必须传入一个参数
我们传入一个是参数
但是我们不传入 self
class Person():name = '老王'age = '18'gender = '男'def __init__(self, name, age, gender):self.name = nameself.age = ageself.gender = genderdef run(self):print("{}是个{}生,今年{}岁".format(self.name,self.gender,self.age))def run_test(args):print("{}是个{}生,今年{}岁".format(self.name,self.gender,self.age))#先实例化两个对象p1 = Person('隔壁老王',24, '男')p2 = Person('老刘', 40,'男')p2.run_test()
将这部分
def run_test(args):print("{}是个{}生,今年{}岁".format(.name,self.gender,self.age))
改成
def run_test(args):print(args.name)
完整代码
class Person():name = '老王'age = '18'gender = '男'def __init__(self, name, age, gender):self.name = nameself.age = ageself.gender = genderdef run(self):print("{}是个{}生,今年{}岁".format(self.name,self.gender,self.age))def run_test(args):print("{}是个{}生,今年{}岁".format(.name,self.gender,self.age))#先实例化两个对象p1 = Person('隔壁老王',24, '男')p2 = Person('老刘', 40,'男')p2.run_test() #老刘
我去,竟然还可以这样,不传入self也是可以的,
没错这里的self并不是什么关键字,也就是说,你可以随意的传入其他的参数,(当然千万别这样做,self已经是一个约定俗称,别人不希望你这么改,你也不希望别人这么改)但是你需要做的是,在这个函数里调用时你不能再使用 self. 而是你传入的参数 比如 args.
class Person():name = '老王'age = '18'gender = '男'def __init__(s, name, age, gender):s.name = names.age = ages.gender = genderdef run(ss):print("{}是个{}生,今年{}岁".format(ss.name,ss.gender,ss.age))def run_test(args):print(args.name)#先实例化两个对象p1 = Person('隔壁老王',24, '男')p2 = Person('老刘', 40,'男')p1.run() #隔壁老王是个男生,今年24岁p2.run_test() #老刘
总结
1、类具有数据属性和函数属性(下一篇会详细讲解)
2、__init__ 用于初始化数据属性,并且不能有返回值。
3、self参数用于蒋实例化对象的数据属性和函数属性绑定到这个函数,但是它并不是特定的,你可以使用其他的代替,当然并不建议这么做。
4、记得 在文末右下角 点一下 在看
python学习专栏
python大神都在关注
喜欢,就为我标星
我就知道你“在看”