目录
组合:
1.什么是组合?
对象的某个属性是另一个类的对象
class Foo:
def __init__(self,bar):
self.bar = bar
class Bar:
pass
bar = Bar()
f = Foo(Bar())
f = Foo(bar)
2.为什么使用组合
可以减少代码的冗余,如我们有两个类分别是学生类,教师类,我们需要学生添加一个选课信息的一个属性,课程信息包括课程名,课程价格,课程周期.这样我们每次添加选课信息都要输入这些信息.所以我们把它定义成一个类.
class Student:
def __init__(self,name,age,course):
self.name = name
self.age = age
self.course = course
class Teacher:
def __init__(self,name,age,level,course):
self.name=name
self.age=age
self.level=level
self.course=course
class Course:
def __init__(self,cname,cprice,cperiod)
self.cname = cname
self.cprice = cprice
self.cperiod = cperiod
course = Course('python',19800,7)
stu = Student('tom',18,course)
tea = Teacher('mary',30,course)
多态:
1.什么是多态?
它表示的是一类事物的多种形态,如水在不同的温度下有不同的状态.
2.什么是多态性?
多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
import abc
class Animal(metaclass=abc.ABCMeta): # 同一类事物:动物
@abc.abstractmethod # 上述代码子类是约定俗称的实现这个方法,加上@abc.abstractmethod装饰器后严格控制子类必须实现这个方法
def talk(self):
raise AttributeError('子类必须实现这个方法')
class People(Animal): # 动物的形态之一:人
def talk(self):
print('say hello')
class Dog(Animal): # 动物的形态之二:狗
def talk(self):
print('say wangwang')
class Pig(Animal): # 动物的形态之三:猪
def talk(self):
print('say aoao')
peo2 = People()
pig2 = Pig()
d2 = Dog()
d2.talk()
pig2.talk()
3.多态性有哪些好处?
1.增加了程序的灵活性
2.增加了程序的可扩展性
封装:
1.什么是封装?
封装的是指我们类的属性以及方法,放在一起就是封装
2.为什么要封装?
封装数据的主要原因是:保护隐私
封装方法的主要原因是:隔离复杂度
3.封装的两个层面
1.创建类和对象会分别创建二者的名称空间,我们只能用类名.或者obj的方式去访问里面的名字,这本身就是一种封装.
2.类中把某些属性和方法隐藏起来(或者说变成私有的),只在类的内部使用,外部无法访问,或者留下少量接口(函数)供外部访问.
#在python中用双下划线的方式实现隐藏属性(设置成私有的)
#类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式:
class A:
__n = 0
def __init__(self):
self.__x = 10
def __foo(self):
print('from A')
def bar(self):
self.__foo()
1.统计对象的name属性被查看了多少次
class Student:
def __init__(self,name,age):
self.__name = name
self.age = age
self.count = 0
def getName(self):
self.count += 1
return self.__name
stu = Student('tony',18)
stu.getName()
print(stu.count)
2 统计一下类被实例化了多少次
class Student:
count = 0
def __init__(self,name,age):
self.__name = name
self.age = age
Student.count+=1
stu = Student('tony',18)
stu2 = Student('tony',18)
stu3 = Student('tony',18)
print(Student.count)
3 通过property写一个计算圆形面积的类中有个area
class circle:
def __init__(self,r):
self.__r = r
@property
def area(self):
return 3.14*self.__r**2
c = circle(1)
print(c.area)
4 选课系统的管理员注册,登录功能写完
import os
import pickle
dic_msg = """
1-管理员注册
2-管理员登陆
"""
admin = {'username':None}
def admin_register():
username = input('请输入用户名:')
password = input('请输入密码:')
filepath = os.path.join(os.path.dirname(os.path.dirname(__file__)),'admin')
file = os.path.join(filepath,f'{username}.pkl')
if os.path.exists(file):
print('用户名已存在!')
else:
user = {'username':username,'password':password}
with open(file,'wb') as fw:
pickle.dump(user,fw)
print('注册成功!')
def admin_login():
username = input('请输入用户名:')
password = input('请输入密码:')
filepath = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'admin')
file = os.path.join(filepath, f'{username}.pkl')
if not os.path.exists(file):
print('用户名不存在!')
else:
with open(file,'rb') as fr:
user = pickle.load(fr)
if user['password'] == password:
admin['username'] = username
print('登录成功!')
else:
print('密码错误!')
dic_func = {
'1':admin_register,
'2':admin_login
}
def run():
while True:
print(dic_msg)
choice = input('请输入你要选择的功能编号:(q退出)')
if choice == 'q':
break
if choice not in dic_func:
print('你的输入有误1')
continue
dic_func[choice]()
if __name__ == '__main__':
run()