Ps:请先看案例,后文有对三大方法的分类总结
1、静态属性class Room:
def __init__(self,name,owner,width,length,heigh):
self.name= name
self.owner= owner
self.width= width
self.length= length
self.heigh= heigh
#计算体积的一个方法
@property #绑定实例的方法(把整个类当做一个装饰器),property操作相当于把函数属性变成了数据属性
def cal_area(self):
print('%s的房间的体积为:' %self.owner, self.width * self.length * self.heigh)
#实例化
v = Room('卧室','Ross',50,50,30) #传入self的参数
v2 = Room('浴室','山治',2,2,3)
#调用对象,因为被变成了数据属性(静态属性),就不需要加括号运行了
#v.cal_area()
#v2.cal_area()
v.cal_area
v2.cal_area
运行结果:
class Room:
tag = 'in Room'
def __init__(self,name,owner,width,length,heigh):
self.name= name
self.owner= owner
self.width= width
self.length= length
self.heigh= heigh
def pr_info(self):
print(self.tag)
@classmethod #一个专门供类使用的方法(类方法),可以不通过实例,只执行类的方法
def pr_infomation(cls,x): #必要参数cls,但不需要再传入self了,因为类中包含了self
print(cls) #打印pr_infomation方法所在的类
print(cls.tag) #这样就可以单独调用类的方法
print(x) #外部传入的形参x
@staticmethod #声明定义一个静态方法,不绑定cls也不绑定self
def eat_food(a,b,c):
print('{} {} {}正在吃饭'.format(a,b,c))
#因为没有绑定类,也没有绑定实例,故不能运行cls和self的属性
#print('%s,%s来自静态方法' %(self.name,self.owner))
#实例化
'''v = Room('卧室','Ross',50,50,30) #传入参数
v2 = Room('浴室','山治',2,2,3)
#调用对象,说明self是可以调用类中定义的数据属性的
v.pr_infomation()
v2.pr_infomation()'''
#类方法,可以传入参数,可以使用类属性
Room.pr_infomation('1') #执行类中的方法,但不实例化,只能访问类的属性
Room.pr_infomation('带参类方法') #传入参数的类方法
#静态方法,只能使用传入的参数
Room.eat_food('路飞','索隆','山治') #用类来调用静态方法
vv = Room('浴室','山治',2,2,3)
vv.eat_food('路飞','索隆','山治') #用实例来调用静态方法方法,同样可行
运行结果:
静态属性(property): 实例属性和类属性都可以访问(属性都能用,但不能传入参数)
类方法(classmethod): 只访问类属性,不能访问实例的属性(类属性能用,传入参数也能用)
静态方法: 不能访问类属性,也不能访问实例属性(只能使用函数调用时传入的参数)
类的组合 1、用法分析class Head:
pass
class Hand:
pass
class Foot:
pass
class Trunk:
pass
class Body:
def __init__(self,name,id_num):
self.name= name
self.id_num= id_num
#用另外一个类来当属性,就称为类的组合
self.head= Head()
self.hand= Hand()
self.foot= Foot()
self.trunk= Trunk()
#实例化
p1 = Body('1234556789','乌索普')
print(p1.__dict__) #另外的类也包括在Body类的属性里面了
运行结果:
#公司类
class Company:
def __init__(self,name,location): #公司名字,公司位置
self.name= name
self.location= location
def hr_interview(self): #面试的动作
print('%s 正在开展面试' %self.name)
#职位类
class Position:
def __init__(self,name,salary,period,company): #4个形参
self.name= name
self.salary= salary
self.period= period
self.company= company
#实例化,存放不同公司的对象
v1 = Company('迪达拉','北京')
v2 = Company('极界','南京')
v3 = Company('木心丸','东京')
v4 = Company('串串香','西京')
vv = Position('熊二',10000,6,v1) #最后一个参数传入一个对象,表示公司
#调用对象
vv.company.hr_interview() #输出组合后的结果,直接调用对象
#让用户实现选择:
#直接输出的语句,表示提示用户可供的选择
print("1-->迪达拉,北京\n2-->极界,南京\n3-->木心丸,东京\n4-->串串香,西京")
while True:
menu = {
'1':v1,
'2':v2,
'3':v3,
}
choice = input('请选择公司>>>')
com_obj = menu[choice] #让用户输入的当做键来匹配对应的值,即那几个公司信息
choice2 = input('请选择职位名>>>')
choice3 = input('请选择薪资>>>')
choice4 = input('请选择周期>>>')
new_pt = Position(choice2,choice3,choice4,com_obj) #创建一个职位的对象
#输出对应的信息,通过类的属性来输出(包括组合属性)
print('{}公司位置在{}\n您应聘的职位是{},薪资{},周期{}'.format(new_pt.company.name,
new_pt.company.location, new_pt.name, new_pt.salary, new_pt.period))
运行结果:
什么时候用类的组合呢?
就是当类之间有显著不同,并且较小的类是较大的类所需要的组件时。
另外,还有类的继承与多态,与类的组合不同的另一个概念,将在后续文章进行总结