面向对象初级:
1.面向对象三大特征:封装 继承 多态 self含义: 指向实例对象本身,让实例能够访问类中的属性和方法
2.类和对象的创建:
类和对象的创建(登录注册功能)
class User:def __init__(self,name,pwd):self.name = nameself.pwd = pwdclass User_Mannager():def __init__(self):self.user_list = []#存放User类对象def regist(self):"""用户注册"""while True:name = input('输入用户名N(退出):')if name.upper() == 'N':breakfor item in self.user_list:if item.name == name:print('用户名已存在,重新输入')flag = Truebreakelse:pwd = input('输入密码:')self.user_list.append(User(name,pwd))print('注册成功')returncontinuedef Login(self):"""用户登录"""while True:name = input('输入用户名:')pwd = input('输入密码:')for i in self.user_list:if i.name == name and i.pwd == pwd:print('登录成功')returnelse:print('用户名密码错误')continuedef run(self):"""程序入口"""while True:func_dict = {'1':self.Login,'2':self.regist}print('界面(N退出):1【登录】2.【注册】')num = input('输入:')if num.upper() == 'N':returnfunc = func_dict.get(num)if func:func()else:print('输入错误')if __name__ == "__main__":obj = User_Mannager()obj.run()
属性:对象具有的特征叫属性
设置和获取对象具有的属性:
1,静态 类中: 对象.属性=值
外部: 设置:obj = Foo(属性的值)
获取:对象.属性
2,动态(反射):以字符串的形式去设置获取对象属性 类中:对象.属性=值或者pass
外部:setattr:新增此对象的属性及值或者修改此对象已经具有的属性的值
格式:setattr(对象 ,属性 (字符串形式),值 (任意类型))
getattr:获取对象已经具有的属性的值
格式:getattr(对象,属性 (字符串形式),默认值(属性不存在时返回,任意类型)
属性的设置和获取(静态和动态)
#设置和获取对象的值方法一(静态):
class Foo:def __init__(self,n,p): #给这个类所创建的对象中公有的属性进行值的初始化self.name = nself.pwd = p
obj = Foo('guohan',123) #设置对象属性的值(对象属性的值封装到对象中)
print(obj.name) #获取对象的值
#>>>guohan#设置和获取对象的值方法二(动态:内置函数): setattr getattr
class Foo:def __init__(self,n,p): #给这个类所创建的对象中公有的属性进行值的初始化self.name = nself.pwd = p
obj = Foo(1,1)
n = input('输入用户名:')
p = input('输入密码:')
setattr(obj,'name',n) #通过内置函数setattr去设置\修改对象的属性
setattr(obj,'pwd',p)
data1 = getattr(obj,'name',0) #通过内置函数getattr去获取对象中封装的属性的值
data2 = getattr(obj,'pwd',0)
data3 = getattr(obj,'email',0)
print(data1)
print(data2)
print(data3)
#>>>guoahn
#>>>111
#>>>0
3.封装: 同一类的方法封装到同一类中 值封装到对象中
类中的属性和方法:公有(一般都是) 私有(以_开头):类实例化的对象无法直接访问私有成员(属性和方法)
获取对象中封装的所有值
对象.__dict__以字典形式获取对象的属性和值
#获取对象中封装的所有的属性ji
class Foo:def __init__(self,name,pwd,eamil):self.name = nameself.pwd = pwdself.eamil = eamil
obj = Foo('guohan','123','888')
print(obj.__dict__)
#>>>{'name': 'guohan', 'pwd': '123', 'eamil': '888'}
setattr(obj,'name','gh')
print(obj.__dict__)
#>>>{'name': 'gh', 'pwd': '123', 'eamil': '888'}
4.继承: 搞清楚self是谁由谁创建 调用方法时去self自己的类中去找
查找方法顺序:先再自己类中找再去基类找(多个基类则由左至右) 时刻注意self是谁
5.多态: 对于一个函数而言,Python对于参数的类型不会限制,那么传入参数时就可以是各种类型,在函数中如果有例如:arg.方法,那么就是对于传入类型的一个限制(类型必须有该方法)。
这就是鸭子模型只要有该方法,就是我们要想的类型