Day22 of learning python--初始面向对象
1.类的定义
在python中,用变量表示特征,用函数表示技能,因而具有相同特征和技能的一类事物就是‘类’,对象则是这一类事物中具体的一个
类的声明:
class 类名: (类名通常以大写字母开头)
‘类的文档字符串’
类体
class Person: #定义一个人类 role = 'person' #人的角色属性都是人 def walk(self): #人都可以走路,也就是有一个走路方法,也叫动态属性 print("person is walking...")
类有两种作用:属性引用和实例化
属性引用(类名.属性)
class Person: #定义一个人类 role = 'person' #人的角色属性都是人 def walk(self): #人都可以走路,也就是有一个走路方法 print("person is walking...") print(Person.role) #查看人的role属性 print(Person.walk) #引用人的走路方法,注意,这里不是在调用 print(Person.walk()) # 调用报错,由于Person是一个类,walk没有self的参数传入
实例化:类名加括号就是实例化,会自动触发__init__函数的运行(初始函数),可以用它来为每个实例定制自己的特征
实例化的过程就是类-->对象的过程
原本我们只有一个Person类,在这个过程中,产生了一个egg对象,有自己具体的名字,语法:对象名=类名(参数)
egg = Person('egon') #类名()就等于在执行Person.__init__() #执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。
实例的查看属性&调用方法
print(egg.name) #查看属性直接 对象名.属性名 print(egg.walk()) #调用方法,对象名.方法名()
self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给它起个别的名字,但是一般是默认值
类属性的补充
一:我们定义的类的属性到底存到哪里了?有两种方式查看 dir(类名):查出的是一个名字列表 类名.__dict__:查出的是一个字典,key为属性名,value为属性值 二:特殊的类属性 类名.__name__# 类的名字(字符串) 类名.__doc__# 类的文档字符串 类名.__base__# 类的第一个父类(在讲继承时会讲) 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲) 类名.__dict__# 类的字典属性 类名.__module__# 类定义所在的模块 类名.__class__# 实例对应的类(仅新式类中) 类属性的补充
实例化的过程:
过程:
类名()首先 会创造出一个对象,创建了一个self变量
调用init方法,类名括号里的参数会被这里接收
执行init方法
返回self
对象能做的事情:
查看属性
调用方法
__dict__对于对象的增删改查操作都可以通过字典的语法进行
类名能做的事:
实例化
调用方法,只不过是需要传递self参数
调用类中的静态属性
__dict__对于类中的名字只能看,不能操作
面向对象小结--定义及调用的固定模式L:
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 #查看对象的属性,直接用 对象名.属性名 即可 对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可
#练习一:在终端输出如下信息 ''' 小明,10岁,男,上山去砍柴 小明,10岁,男,开车去东北 小明,10岁,男,最爱大保健 老李,90岁,男,上山去砍柴 老李,90岁,男,开车去东北 老李,90岁,男,最爱大保健 老张… ''' class Person: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def shang(self): print('%s,%s岁,%s,上山去砍柴' % (self.name,self.age,self.sex)) def kai(self): print('%s,%s岁,%s,开车去东北' % (self.name,self.age,self.sex)) def zui(self): print('%s,%s岁,%s,开车去东北' % (self.name,self.age,self.sex)) x1 = Person('小明','10','男') x1.shang() ''' 函数的做法 def shangshan(name,age,sex): print('%s,%s岁,%s,上山去砍柴'%(name,age,sex)) def drive(name,age,sex): print('%s,%s岁,%s,开车去东北'%(name,age,sex)) def shangshan(name,age,sex): print('%s,%s岁,%s,最爱大保健'%(name,age,sex)) shangshan('小明',10,'男') '''
2.对象之间的交互
狗和人打架,两个不通的对象进行交互
#创建一个狗类 class Dog: def __init__(self,name,hp,aggr,life_value): self.name = name self.hp = hp self.aggr = aggr self.life_value = life_value def bite(self,person): person.blood -= self.aggr #创建一个人 class Person: def __init__(self,name,blood,aggr,pro): self.name = name self.blood = blood self.aggr = aggr self.pro = pro def attack(self,dog): dog.hp -= self.aggr l = Person('lin',100,10,'student') d = Dog('hei',50,20,'teddy') l.attack(d) print(d.hp) d.bite(l) print(l.blood) # d.bite(d) # print(d.hp)
from math import pi class Circle: ''' 定义了一个圆形类; 提供计算面积(area)和周长(perimeter)的方法 ''' def __init__(self,radius): self.radius = radius def area(self): return pi * self.radius * self.radius def perimeter(self): return 2 * pi *self.radius circle = Circle(10) #实例化一个圆 area1 = circle.area() #计算圆面积 per1 = circle.perimeter() #计算圆周长 print(area1,per1) #打印圆面积和周长 一个简单的例子帮你理解面向对象
浙公网安备 33010602011771号