python -- 面向对象/类/对象调用类中的变量和方法
本节内容:
1.初识面向对象
2.类,对象调用类中的变量和方法
一.初识面向对象
面向过程 的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,考虑周全什么时候处理什么东西.
优点:极大的降低了写程序的复杂度,跟着解题思路堆叠代码.
缺点:流程就是用来解决一个问题,代码牵一发而动全身.
应用场景:一旦完全基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
面向对象 的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。
*** (了解一些名词:类、对象、实例、实例化
类:具有相同特征的一类事物(人、狗、老虎)
对象/实例:具体的某一个事物(隔壁阿花、楼下旺财)
实例化:类——>对象的过程(这在生活中表现的不明显,我们在后面再慢慢解释)) ***
面向对象_解决思路:
1.先把所有的事物做一个分类,例如人类..武器类
2.实例化类的对象:某个人,某个武器
(1)将类的共同特征,(一般是静态的名词,不会改变的,区别与其他类的特征),放在类的静态变量中
例如:
class Person: language="语言" #静态变量 money="货币"
(2)将对象的某些共同具有又相互区别的动态属性作为参数封装在某个方法(一般是初始化方法__init__)中.
例如:
class Person: def __init__(self,name,age,sex): self.name=name #姓名 self.age=age #年龄 self.sex=sex #性别
3.使用对象进行操作
二.类,对象调用类中的变量和方法
面向对象中:
类:具有相同属性(静态变量)和技能(动态变量/方法)的一类事物.
例如: 人类(静态:有思想;动态:会工作),,武器类,动物类,猫科类,狗类...
对象:具体的类的表现,类中的一个具体实物.
例如:人类中的某一个人,武器类的某一个武器,猫类中的某一只猫.
实例化:将类具体到类的某一个对象的过程
例如:人类中具体到叫爱迪生的人.
2.1.类的知识
类的结构:
class Person:
类体(类体包括静态变量和方法两部分)
静态变量: (别称) 静态字段/变量.(一般全大写)
动态变量: (别称) 方法/函数
1.类的声明
def functionName(args): '函数文档字符串' 函数体 ''' class 类名: '类的文档字符串' 类体 ''' #我们创建一个类 class Data: pass
2,属性
class Person: #定义一个人类 role = 'person' #人的角色属性都是人 def walk(self): #人都可以走路,也就是有一个走路方法 print("person is walking...") print(Person.role) #查看人的role属性 print(Person.walk) #引用人的走路方法,注意,这里不是在调用
3,实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征
实例化的过程就是类——>对象的过程
原本我们只有一个Person类,在这个过程中,产生了一个p对象,有自己具体的名字
语法:对象名 = 类名(参数)
4,self
谁(对象)调用该方法,谁的全部属性都在self中,在该方法中通过 self.属性 可以找到该对象的属性
某个类的某一个对象调用这个类中的所有方法时,方法中所有的self包含的内容都一样
在实例化时自动将对象/实例本身传给__init__的第一个参数self,你也可以给他起个别的名字,但是正常人都不会这么做。
class Person: #定义一个人类 role = 'person' #人的角色属性都是人 def __init__(self,name): self.name = name # 每一个角色都有自己的昵称; def walk(self): #人都可以走路,也就是有一个走路方法 print("person is walking...") # 类名+(),实例化,自动触发__init__(self)函数的执行,将对象p传给self,也就是他们共同指向同一个内存地址,通过self为p空间封装属性, # p是人类中的一个实例,也就是马小静 p=Person("马小静") print(Person.role) #查看人的role属性 print(Person.walk) #引用人的走路
5,类属性的补充
一:我们定义的类的属性到底存到哪里了?有两种方式查看 dir(类名):查出的是一个名字列表 类名.__dict__:查出的是一个字典,key为属性名,value为属性值 二:特殊的类属性 类名.__name__# 类的名字(字符串) 类名.__doc__# 类的文档字符串 类名.__base__# 类的第一个父类(在讲继承时会讲) 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲) 类名.__dict__# 类的字典属性 类名.__module__# 类定义所在的模块 类名.__class__# 实例对应的类(仅新式类中)
2.2,对象的相关知识
class 类名: def __init__(self,参数1,参数2): self.对象的属性1 = 参数1 self.对象的属性2 = 参数2 def 方法名(self):pass def 方法名2(self):pass 对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西 #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法 #括号里传参数,参数不需要传self,其他与init中的形参一一对应 #结果返回一个对象 对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可 对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可
2.3 类,对象调用类中的变量和方法
# 从类的角度进行操作: 类不能引用对象的属性
#1.类对静态变量的操作
#(1)类名.__dict__ 查看类中所有的内容,只能查看
# print(Person.__dict__) #查看类中的所有内容,打印为字典的形式.
# print(Person.__dict__['faith']) #找到类的静态变量"faith"对应的值,#有信仰的
# print(Person.__dict__['mind']) #有思想的
# Person.__dict__['mind'] = '无脑' #报错,只能查看,不能修改
# (2)类名.静态变量名 用万能的点对单个类中静态变量的操作:增删改查
# print(Person.__dict__) #查看类中的所有内容,但不能进行其他操作
# Person.money="使用货币" #对静态变量的增加
# del Person.faith #对静态变量的删除
# Person.mind="无脑的" #对静态变量的修改
# print(Person.__dict__)
# 2.类对动态变量(函数)的调用,需要加实参(工作中基本不用类名去操作,除了类方法/静态方法需要类名调用,剩下的方法都需要类名调用)
# Person.work() #不能直接调用方法
# Person.work(1) #必须要加参数,参数任意写
#对象的角度
# 1.对象对静态变量的操作
# (1)对象对类中静态变量的操作 ,语法: 对象.类的静态变量
#print(ret.mind) #mind是类Person的静态变量.ret是类的实例化对象 #有思想的
# (2)对象对自身属性(静态变量)的操作,语法: 对象.对象的静态变量
# print(ret.sex) #sex是实例ret自身的属性 # 女
# 2.对象对类的动态变量/方法的操作,
# 语法: 对象.类的函数()
# 括号中不用传参数,通过类名引用类的方法时必须传参数
# 对象里没有动态变量
# ret.work() #work()是类中的动态变量 #人类都会工作
# ret.shop() #人类都会消费
class Person: #定义一个叫Person的类,类名的首字母大写 mind="有思想的" #类体:(2部分)静态变量+动态变量(函数/方法) animal="高级动物" faith="有信仰的" #静态变量/静态字段 #方法中的self均执行实例化对象的空间 def __init__(self,name,age,sex): #给具体对象封装属性 self.name=name #类比于Person.mind=值,右边的name/age/sex的值来自于函数__init__的形参给的值,一一对应. # 左边是在self内存空间新开辟(新增/新命名)用以赋值的变量 self.age=age self.sex=sex def work(self): #动态变量/方法/函数 print("人类都会工作") def shop(self): print("人类都会消费") ret=Person("马小静",18,"女") #一遇到类名+(),也就是Person+(),程序默认执行__init__函数(self), # self是默认形参,不需要添加实参,程序自动执行,ret和self一样,打印出来结果是一样的内存地址,指向同一个内存空间 print(ret) #ret相当于新开辟的内存空间,和__init__(self)中的self一样 <__main__.Person object at 0x000000D0DCA77B00> print(ret.__dict__) #相当于打印的__init__()函数中的self中的所有内容 {'name': '马小静', 'age': 18, 'sex': '女'} #ret和self是同一个内存地址