python面向对象之类和对象
一. 类和对象
类:具有相同属性和方法的一类事物就是类
对象和类的关系:
对象是一个实实在在存在的事物,是独一无二的
类是一个抽象的大致规范了一类事物的范围
#面向对象编程 #有一个抽象的过程 #结果不能预测 #上帝视角 class Person: role='人' #静态属性 country='中国' def attack(self): #动态属性,方法 pass print(Person.role) print(Person.attack) #方法调用 Person.role='人类' #属性修改 print(Person.__dict__['role']) hantao=Person() #对象 print(hantao.role) hantao.name='hantao' #对象创建属性 print(hantao.name) egg=Person() egg.name='egon' print(egg,hantao)
1.类中可以有任意python代码,这些代码在类定义阶段便会执行
2.因而会产生新的名称空间,用来存放类的变量名与函数名,可以通过 类名.__dict__ 查看
3.对于经典类来说我们可以通过该字典操作类名称空间的名字(新式类有限制),但python为我们提供专门的.语法
4.点是访问属性的语法,类中定义的名字,都是类的属性
*************************************************************************************************
#类加上括号的过程: 实例化 #先加上创建一个空对象 #再执行__init__,同时把创建的对象放在__init__参数里 #实例化对象
#使用init进行属性的初始化 #1.规范所有的对象都拥有一些基础的属性 #2.方便 class Dog: def __init__(self,name,type): self.name=name self.type=type self.HP=2000 def bite(self,name): print('%s咬了%s'%(self.name,name)) wangcai=Dog('旺财','中华田园犬') print(wangcai.__dict__) wangcai.bite('hantao')
#python为类内置的特殊属性 类名.__name__# 类的名字(字符串) 类名.__doc__# 类的文档字符串 类名.__base__# 类的第一个父类(在讲继承时会讲) 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲) 类名.__dict__# 类的字典属性 类名.__module__# 类定义所在的模块 类名.__class__# 实例对应的类(仅新式类中)
#类型dict就是类dict >>> list <class 'list'> #实例化的到3个对象l1,l2,l3 >>> l1=list() >>> l2=list() >>> l3=list() #三个对象都有绑定方法append,是相同的功能,但内存地址不同 >>> l1.append <built-in method append of list object at 0x10b482b48> >>> l2.append <built-in method append of list object at 0x10b482b88> >>> l3.append <built-in method append of list object at 0x10b482bc8> #操作绑定方法l1.append(3),就是在往l1添加3,绝对不会将3添加到l2或l3 >>> l1.append(3) >>> l1 [3] >>> l2 [] >>> l3 [] #调用类list.append(l3,111)等同于l3.append(111) >>> list.append(l3,111) #l3.append(111) >>> l3 [111]
小练习:
创建计算圆的面积周长
from math import pi class Circle: def __init__(self,r): self.r=r def s(self): return self.r**2*pi def c(self): return 2*pi*self.r c1=Circle(3) print(c1.s()) print(c1.c())
二. 交互
class Dog: counter=0 def __init__(self,name,type,aggr): self.name=name self.type=type self.life_value=2000 self.aggr=aggr Dog.counter+=1 def bite(self,person_name): print('%s咬了%s'%(self.name,person_name.name)) person_name.life_value-=self.aggr class Person: rol = '人' #数据属性、静态属性、类属性 country = '中国' def __init__(self,name,age,life_value): #初始化方法 self.name = name #属性、对象属性 self.theage = age self.life_value = life_value self.aggr = 1 def attack(self,dog_obj): #函数属性、动态属性、方法 print('%s打了%s'%(self.name,dog_obj.name)) dog_obj.life_value-=self.aggr egg=Dog('egon','二哈',20) hantao=Person('hantao',18,500) print(hantao.life_value) egg.bite(hantao) print(hantao.life_value) hantao.attack(egg)