18.1、说明:
1、什么是类和对象:
数据属性和方法属性的结合体就一个对象;
从一组对象中提取相似的部分就是类,类是对象都具有的数据属性和方法属性的结合体;
2、通常情况下,在类中定义的所有函数(注意了,这里说的就是所有,跟self啥的没关系,self也只是一个再普通不过的参数而已)都是对象的绑定方法,
对象在调用绑定方法时会自动将自己作为参数传递给方法的第一个参数。除此之外还有两种常见的方法:静态方法和类方法,二者是为类量身定制的,但
是实例非要使用,也不会报错,只不过实例去调用的时候容易让人混淆,不知道你要干啥,且实例在使用时丧失了自动传值的机制;
18.2、示例:
class Room:
tag=1
def __init__(self,name,owner,width,length,heigh):
self.name=name
self.owner=owner
self.width=width
self.length=length
self.heigh=heigh
def test(self):
print('from test',self.name)
# 普通方法
@property
def cal_area(self):
return self.width * self.length
# 静态属性
@classmethod
def tell_info(cls,x):
print(cls)
print('--》',cls.tag,x)
# 类方法
@staticmethod
def wash_body(a, b, c):
print('%s %s %s正在洗澡' % (a, b, c))
# 静态方法
r1=Room('房间1','lc1',20,20,10)
r1.test()
print(r1.cal_area)
print(r1.name)
# from test 房间1
# 400
# 房间1
# 静态属性修饰的函数绑定的是对象(函数内能使用类变量和对象变量),对象可以通过调用数
# 据属性的方式调用函数属性,可以有效的隐藏函数属性下的代码逻辑;
Room.tell_info(10)
# <class '__main__.Room'>
# --》 1 10
# 类方法修饰的函数绑定的是类(函数内不能使用对象变量),在默认的情况下函数默认是绑定
# 对象的,类方法是专门为类所使用的;
# r1.tell_info(5)
# <class '__main__.Room'>
# --》 1 5
# 对象也可以使用,但通常类方法都是给类用的;
Room.wash_body('lc1','lc2','lc3')
# lc1 lc2 lc3正在洗澡
# 静态方法修饰的函数既不绑定类也不绑定对象(函数内不能使用类变量和对象变量),是类的
# 工具包;
# r1.wash_body('lc1','lc2','lc3')
# lc1 lc2 lc3正在洗澡
# 对象也可以使用,但通常静态方法都是给类用的;
18.3、补充、组合:
1、组合是在一个类中以另外一个类的对象作为数据属性,称为类的组合,用于相似性小的类之间;
2、作用:提高的软件的重用性;
3、组合与继承的区别:
(1)继承:建立了派生类与基类之间的关系,它是一种“是”的关系,比如白马是马,人是动物,当类之间有很多相同的功能,
提取这些共同的功能做成基类,用继承比较好,比如老师是人,学生也是人。
(2)组合:建立了类与组合类之间的关系,它是一种“有”的关系,比如教授有生日,教授有课程,教授有学生。
4、示例:
class School:
def __init__(self,name,addr):
self.name=name
self.addr=addr
def zhao_sheng(self):
print('%s 正在招生' %self.name)
class Course:
def __init__(self,name,price,period,school):
self.name=name
self.price=price
self.period=period
self.school=school
# 学校里有课程
s1=School('oldboy','北京')
s2=School('oldboy','南京')
s3=School('oldboy','东京')
# c1=Course('linux',10,'1h','oldboy 北京')
# c1=Course('linux',10,'1h',s1)
msg='''
1 老男孩 北京校区
2 老男孩 南京校区
3 老男孩 东京校区
'''
while True:
print(msg)
menu={
'1':s1,
'2':s2,
'3':s3
}
choice=input('选择学校>>: ')
school_obj=menu[choice]
# print(menu['1'])
# <__main__.School object at 0x0000027DAD2435C0>
name=input('课程名>>: ')
price=input('课程费用>>: ')
period=input('课程周期>>: ')
new_course=Course(name,price,period,school_obj)
print('课程【%s】属于【%s】学校' %(new_course.name,new_course.school.name))