目录:https://www.jianshu.com/p/863c446364a8
一、面向对象初识
在学习面向对象之前呢?我们先来看看函数式编程和面向对象式编程的区别。
函数式编程
# auth 认证相关
def login():
pass
def regisgter():
pass
# account 账户相关
def func():
pass
面向对象式编程
class Auth:
def login(self):
pass
def regisgter(self):
pass
class Account:
def func(self):
pass
我们可以从上边两个编程可以看出面向对象的两个优点:
第一个优点:面向对象编程是一类相似功能函数的集合,使你的代码更清晰化,更合理化。
第二个优点:面向对象,要拥有上帝的视角看问题,类其实就是一个公共模板(厂房),对象就从具体的模板实例化出来
说到这里我们还没有对面向对象有一个深刻理解,下面我们就来谈谈面向对象是什么?
面向对象(OOP),全称Object Oriented Programming。面向对象编程中一切事物皆对象。他将现实的事物抽象出来,把现实生活的事物以及关系,抽象成类,通过继承,实现,组合的方式把万事万物都给容纳了。
那么问题来了,什么是类?什么是对象呢?
类:具有相同功能和特性的一类事物
对象:类的具体体现
具体解释就是人作为一类,猫是一类,狗又为一类,你家养的泰迪就是对象。
⾯向对象思维, 要⾃⼰建立对象. ⾃⼰建立场景. 你是就是⾯向对象世界中的上帝. 你想让⻋⼲嘛就⼲嘛. 你想让⼈⼲嘛⼈就能⼲嘛。
下面我们来分析一下类的结构。
class Student:
daily="学习" #变量(之前)静态属性,也可称属性 静态字段
examination="考试"
def work(self): #函数(之前)方法,动态方法 动态属性
print("每天要上课")
def homework(self):
print("家庭作业")
总结:class是关键字,定义一个类,Student是类名,类名首字母大写,私有类可以用下划线开头。
类的结构大体分为两个部分:
静态属性、动态方法
二、从类名的角度研究类
1、类名操作静态属性
方法一:
查看类中所有内容:类名.__dict__
class Student:
'''
此类是构建学生类
'''
daily="学习"
examination="考试"
def work(self):
print("每天要上课")
def homework(self):
print("家庭作业")
print(Student.__dict__) #查看类中的所有属性
print(Student.__dict__["daily"]) #一般用于查看所有内容,不会这样单独查询属性,也不能增删改。
运行结果为:
{'__module__': '__main__', 'daily': '学习', 'examination': '考试', 'work':
, 'homework': , '__dict__': , '__weakref__': , '__doc__': None} 学习
方法二:
万能的点:类名.属性
class Student:
daily="学习"
examination="考试"
def work(self):
print("每天要上课")
def homework(self):
print("家庭作业")
print(Student.daily) #查
运行结果:
学习
Student.cloth="校服"
print(Student.__dict__) #增
运行结果:
{'__module__': '__main__', 'daily': '学习', 'examination': '考试', 'work':
, 'homework': , '__dict__': , '__weakref__': , '__doc__': None, 'cloth': '校服'}
Student.examination="不考试" #改
print(Student.examination)
运行结果:
不考试
del Student.daily
print(Student.__dict__) #删
运行结果:
{'__module__': '__main__', 'examination': '考试', 'work':
, 'homework': , '__dict__': , '__weakref__': , '__doc__': None} #一般类中的属性都是通过类名.的方式去操控的。
总结:如果想查询类中的所有内容,通过 第一种__dict__方法,如果只是操作单个属性则用万能的点的方式。
2、类名操作动态方法
前提:除了两个特殊方法:静态方法,类方法之外,一般不会通过类名操作一个类中的方法。
class Student:
daily="学习"
examination="考试"
def work(self):
print("每天要上课")
def homework(self):
print("家庭作业")
Student.work(555)
运行结果:
每天要上课
#可以这样做,但是一般不用
三、从对象的角度研究类
在上边的描述中我们简单提到了对象,下面我们深究一下。
1、什么是对象?
对象:类名加上(),这是一个实例化过程,这个就会实例化一个对象。
我们通过代码来看一下:
class Student:
daily="学习"
examination="考试"
def __init__(self):
self.name="Danny"
self.sex="男"
def work(self):
print("每天要上课")
def homework(self):
print("家庭作业")
obj=Student() #类名() 过程就叫做实例化过程,实例化一个对象,它会自动执行__init__方法
print(obj) #obj对象,也叫一个实例,obj的地址与self的地址相同
运行结果:
<__main__.Student object at 0x00CB6CB0>
总结:实例化一个对象时发生了三件事:
#1.在内存中创建一个对象空间
#2.自动执行__init__方法,并且将对象空间传给self参数,
#3.执行__init__方法里面的代码,给对象空间封装其属性。
实例:
class Student:
daily="学习"
examination="考试"
def __init__(self,name,sex):
# self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装两个属性。
self.name=name
self.sex=sex
def work(self):
print("每天要上课")
def homework(self):
print("家庭作业")
obj=Student("Danny","男")
2、对象角度可以操作对象空间的属性
方法一 :
对象查询对象中所有属性:对象.__dict__
class Student:
daily="学习"
examination="考试"
def __init__(self,name,sex):
# self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装两个属性。
self.name=name
self.sex=sex
def work(self):
print("每天要上课")
def homework(self):
print("家庭作业")
obj=Student("Danny","男")
print(obj.__dict__)
运行结果:
{'name': 'Danny', 'sex': '男'}
方法二:
对象操作对象中的单个属性。 万能的点 . 对象.属性
class Student:
daily="学习"
examination="考试"
def __init__(self,name,sex):
self.name=name
self.sex=sex
def work(self):
print("每天要上课")
def homework(self):
print("家庭作业")
obj=Student("Danny","男")
obj.age="29" #增
print(obj.__dict__)
运行结果:
{'name': 'Danny', 'sex': '男', 'age': '29'}
del obj.name #删
print(obj.__dict__)
运行结果:
{'sex': '男'}
obj.sex="女" #改
print(obj.__dict__)
运行结果:
{'name': 'Danny', 'sex': '女'}
print(obj.name) #查
运行结果:
Danny
3、 一个类实例化多个对象
class Student:
daily="学习"
examination="考试"
def __init__(self,n,a,s,h):
self.name=n
self.age=a
self.sex=s
self.hobby=h
def work(self):
print("每天要上课")
def homework(self):
print("家庭作业")
Danny=Student("Danny",20,"男","打篮球")
Jenny=Student("Jenny",21,"女","看电影")
print(Danny.__dict__)
print(Jenny.__dict__)
运行结果:
{'name': 'Danny', 'age': 20, 'sex': '男', 'hobby': '打篮球'}
{'name': 'Jenny', 'age': 21, 'sex': '女', 'hobby': '看电影'}
4、对象查看类中属性
class Student:
daily="学习"
examination="考试"
def __init__(self,n,a,s,h):
self.name=n
self.age=a
self.sex=s
self.hobby=h
def work(self):
print("每天要上课")
def homework(self):
print("家庭作业")
Danny=Student("Danny",20,"男","打篮球")
print(Danny.daily)
运行结果:
学习
#对象只能查看或获取类中属性,不能增删改类中属性,如果改的话只能改对象空间中的属
5、对象调用类中方法
class Student:
daily="学习"
examination="考试"
def __init__(self,n,a,s,h):
self.name=n
self.age=a
self.sex=s
self.hobby=h
def work(self,c):
self.colour=c
print("每天要上课")
def homework(self):
print("家庭作业")
Jenny=Student("Jenny",21,"女","看电影")
Jenny.work("pink")
print(Jenny.__dict__)
运行结果:
每天要上课
{'name': 'Jenny', 'age': 21, 'sex': '女', 'hobby': '看电影', 'colour': 'pink'}
类中的方法一般都是通过对象执行的(出去类方法,静态方法外),并且对象执行这些方法都会自动将对象空间传给方法中的第一个参数self.
那么self什么呢?
self就是类中方法的第一个位置参数(默认参数)如果通过对象执行此方法,解释器就会自动的将此对象空间当做实参传给self
约定俗称:类中的方法第一个参数一般都设置成self