python之面向对象

一、初识面向对象

函数编程的优缺点:

  • 减少代码的重复性

  • 增强代码的可阅读性

缺点:

  • 但凡更改或者增加一条需求,可能整个项目都随之改变.

面向对象编程的优点:

  • 是一类相似功能函数的集合,使你的代码更清晰化,更合理化。

  • 面向对象,要拥有上帝的视角看问题,类其实就是一个公共模板(厂房),对象就从具体的模板实例化出来

什么是类?什么是对象?

类:就是具有相同属性和功能的一类事物。

对象:就是类的具体表现

类和对象之间的关系:

类:

是一个大范围,是一个模子,它约束了事务有哪些属性,但是不能约束具体的值,只有两部分变量和函数

对象:

是一个具体的内容,它是模子的产物,它遵循了类的约束,同时给属性赋上了具体的值

类的格式:

class Student: #类名

	daily = '学习' #1️⃣属性,静态属性
	exam = '考试'


	def work(self): #2️⃣方法,动态方法
		print('每天上课')

	def homework(self):
		print('家庭作业')     

类的格式详解:

class Person: #类名可以随便定义,大写开头,要具有可描述性,建议使用驼峰体
   def __init__(self,name,sex,job,hb,weapon,ad): # 这个其实就是一个字典
      self.name = name #名字可以不相同
      self.sex = sex
      self.job = job
      self.hb = hb
      self.weapon = weapon
      self.ad = ad

alex = Person('alex', '不详', '搓澡工', 250, '搓澡', 1) #给类名传参

wusir = Person('wusir', '男', '法师', 500, '打狗棍', 1000)

# 调用
print(alex.__init__) # 可以查看整个alex的字典
# 输出结果如下
{'name': 'alexsb', 'sex': '不详', 'job': '搓澡工', 'hb': 250, 'weapon': '搓澡', 'ad': 1}

class 是关键字与def用法相同,定义一个类。
Human是此类的类名,类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头

preson是一个类: Alex wusir都是这个类的对象

类有一个空间,存储的是定义在class中的所有名字

每一个对象又拥有自己的空间,通过对象名.__dict__就可以查看这个对象的属性和值

二、从类名的角度研究类

查看类名角度调用类中的属性

1. 查看类中的所有内容 类名.__dict__只用于获取类中全部内容
print(Student.__dict__)
2. 万能的.点. 来进行增删改查

类名操作静态属性

class Student:

	daily = '学习'
	exam = '考试'


	def work(self):
		print('每天上课')

	def homework(self):
		print('家庭作业')
		
# 通过操作类名的增删改查
print(Student.daily)   #1️⃣查看类属性
Student.cloth = '校服'  #2️⃣增加类属性
Student.exam = '不考试' #3️⃣修改类属性
del Student.cloth      #4️⃣删除类属性
print(Student.__dict__) #5️⃣查看类名Student中全部内容

类的实例化过程方法

#方法 6️⃣类名+括号
obj = Student() # 类名加括号过程就叫做实例化过程
print(obj) # 对象,实例,结果是一个对象的内存地址

三. 从对象的角度研究类

什么是对象

对象是从类中出来的,只要是类名加上(),这就是一个实例化过程,这个就会实例化一个对象

对象名操作动态方法

增:

# 1️⃣属性的增加
alex.money = 1000000 

# 还以上面格式为例
# 打印该对象增加值之前
print(alex.__dict__)
# 输出结果
{'name': 'alexsb', 'sex': '不详', 'job': '搓澡工', 'hb': 250, 'weapon': '搓澡', 'ad': 1}
# 打印该添加属性后的对象
print(alex.__dict__)
# 输出字结果
{'name': 'alexsb', 'sex': '不详', 'job': '搓澡工', 'hb': 250, 'weapon': '搓澡', 'ad': 1, 'money': 1000000}

# 2️⃣属性的删除
del alex.money

# 打印删除字典键值对之后
{'name': 'alexsb', 'sex': '不详', 'job': '搓澡工', 'hb': 250, 'weapon': '搓澡', 'ad': 1}

# 3️⃣属性的修改
alex.name = 'alex'

# 打印修改之后的结果
{'name': 'alex', 'sex': '不详', 'job': '搓澡工', 'hb': 250, 'weapon': '搓澡', 'ad': 1}

# 4️⃣属性的查询
print(alex.name)

# 查对象
print(alex.__dict__)

# 打印查询的结果
alex

四、实例化一个对象

实例化一个对象总共发生了三件事(不太明白)

 1. 在内存中开辟了一个对象空间。

 2. 自动执行类中的__init__方法,并将这个对象空间(内存地址)传给了__init__方法的第一个位置参数self。

 3. 在__init__ 方法中通过self给对象空间添加属性。

格式:

class Student:

	daily = '学习'
	exam = '考试'

	def __init__(self,n,a,h): #类 可以当做一个模板 1️⃣给这个设置形参
		self.name = n
		self.age = a
		self.hobby = h

	def work(self):
		print('每天上课')

	def homework(self):
		print('家庭作业')

liye = Student('小黑',18,'洗头') #2️⃣传参,然后定义一个变量接收
print(liye.__dict__)
mc_sq = Student('骚强',20,'黑玫瑰发廊') #3️⃣传另外一个参,然后定义一个变量接收

对象调用对象的属性

liye = Student('小黑',18,'洗头') #实例化过程
mc_sq = Student('骚强',20,'黑玫瑰发廊') #实例化过程
print(liye.name)  #1️⃣对象调用对象的属性
print(mc_sq.age) #2️⃣对象调用对象的属性

# 输出结果
小黑
20

对象调用类中的属性

print(mc_sq.__dict__) #1️⃣调用对象中的全部内容
print(liye.daily) #2️⃣对象调用类中的属性
print(mc_sq.exam) #3️⃣对象调用类中的属性

# 输出结果
{'name': '骚强', 'age': 20, 'hobby': '黑玫瑰发廊'}
学习
考试

对象调用类中的方法

class Student:

	daily = '学习'
	exam = '考试'

	def __init__(self,n,a,h): #1️⃣实例化过程将值传入到这个 方法中
		self.name = n
		self.age = a
		self.hobby = h

	def work(self,c): #2️⃣对象调用类中的方法,self指向同一个内存地址
		self.color = c
		print(f'{self.name}每天上课')

	def homework(self):
		print('家庭作业')

liye = Student('小黑',18,'洗头') #实例化过程
liye.work('绿油油') #3️⃣给类中方法传值,传给word方法中的c,self共用同一个内存liye
print(liye.__dict__) #查看对象的全部内容

# 输出结果
liye.work('绿油油')
print(liye.__dict__)

五、什么是self?

  • self就是类中的方法的第一个位置参数
  • 如果通过对象执行此方法,解释器就自动的将此对象空间当做实参传给self
  • 约定俗成:类中的方法第一个参数一般都设置成self

六、一个类可以实例化多个对象

例题:

# 人狗大战
# 人的类
class Person:
	def __init__(self,name,sex,job,hp,weapon,ad):
		self.name = name
		self.sex = sex
		self.job = job
		self.level = 0
		self.hp = hp
		self.weapon = weapon
		self.ad = ad

	def 搓(self,dog):
		dog.hp -= self.ad
		print('%s给%s搓了澡,%s掉了%s点血,%s当前的血量%s'%(self.name,dog.dog_name,dog.dog_name,self.ad,dog.dog_name,dog.hp))


# 狗的类
class Dog():
	def __init__(self,name,hp,ad,kind):
		self.dog_name = name
		self.hp = hp
		self.ad = ad
		self.kind = kind

	def 添(self,person):
		if person.hp >= self.ad:
			person.hp -= self.ad
		else:
			person.hp = 0
		print('%s添了%s一下,%s掉了%s点血,%s当前的血量%s'%(self.dog_name,alex.name,alex.name,self.ad,alex.name,person.hp))

alex = Person('alex', '不详', '搓澡工', 250, '搓澡巾', 1)
二哈 = Dog('二哈',100,2000,'哈士奇')

alex.搓(二哈)
二哈.添(alex)

posted @ 2019-07-05 20:07  爱咋闹  阅读(200)  评论(0编辑  收藏  举报