面向对象补充练习

面向对象练习

#练习一
class Base:
    x = 1
obj = Base()
print(obj.x)
obj.y = 123
print(obj.y)
obj.x = 123
print(obj.x)
print(Base.x)
'''
输出结果
1
123
123
1
'''


#练习二
class Foo(object):
    n1 = '武沛齐'
    def __init__(self,name):
        self.n2 = name
obj = Foo('太白')
print(obj.n1)
print(obj.n2)

print(Foo.n1)
print(Foo.n2)??
'''
输出结果为:
武沛齐
太白
武沛齐
type object 'Foo' has no attribute 'n2'
报错原因:在没有实例化对象时,__init__并不会自动执行,所以会报错
'''


#在对象中定义的数值在实例化时可以重新定义数值,即再次调用的时候数值是更改后的数值

class User:
    def __init__(self,name,pwd):  # 把用户信息全都封装到此处
        self.name = name
        self.pwd = pwd

class Account:

    def __init__(self):
        self.user_list = [] #那么会不会有一个疑问,
                            #答上一个问题:可以,是类变量


    def login(self):
        username = input("请输入用户名:")
        userpwd = input("请输入密码")
        flag = False #falg的用法确实要谨记
        for i in self.user_list:#在同一个类中,self指的是obj,所以之间的相互调用是被允许的。
            if i.name == username and i.pwd == userpwd:
                flag = True
        if flag :
            print("登录成功")
        else:
            print("用户名或密码错误")

    def register(self):

        while True:
            user = input("请输入用户命:")
            pwd =  input ("请输入密输入N,输入N停止:")
            if pwd == "N":
                return  #是直接跳出这个函数,返回上一级的函数
            user_object = User(user,pwd) #封装的思想!!!直接User哐叱给干进去了。那么是否可以用方法呢,主动执行,是否可以可以考虑将其封装到一个方法中呢?
                                         #答上述问题:所谓的封装数据必然是用到的类而不是所谓的方法,所以User的存在是必要且必须的。
            self.user_list.append(user_object) #此处的user_object应该是实例化的对象


    def run(self):
        #主程序

        while True:
            print("1.注册;2.登录")
            choice = input("请选择:")
            if choice == "1":
                self.register()
            elif choice =="2":
                self.login()
            else:
                print("选择错误")

if __name__ == "__main__":
    obj = Account()
    obj.run()
'''
总结与思考
1.对于多个同一属性的函数时,一定要学会将其封装到一个类中
2.对于数据的封装一定是再起一个新的类,而不是一个新的方法
3.主程序的思维也要学会使用
'''
posted @ 2020-11-15 16:14  小杨的冥想课  阅读(51)  评论(0编辑  收藏  举报