第三模块:面向对象&网络编程基础-第1章 面向对象-练习题(编程题)

1.请用面向对象的形式优化以下代码

class Sql:
    host= '127.0.0.1'
    port=3306
    db='db1'
    charset='utf8'
    sql='select * from tb1;'
    proc_name='存储过程的名字'
    def __init__(self,*args):
        self.args=args
    def connect(self):
        pass
    def exc(self):
        if self.args == self.sql:
            conn = self.connect(self.host,self.port,self.db,self.charset)
            res=conn.execute(self.sql)
            return res
        elif self.args == self.proc_name:
            conn = self.connect(self.host, self.port, self.db, self.charset, self.proc_name)
            res = conn.call_proc(self.sql)
            return res
ex=Sql('select * from tb1;')
print(ex.__dict__)

2.请简单解释Python中 staticmethod(静态方法)和 classmethod(类方法), 并分别补充代码执行下列方法。
非绑定方法:不与类或对象绑定staticmethod
绑定到类的方法:在类内定义的被装饰器@classmethod修饰的方法

class A(object):

   def foo(self, x):
       print("executing foo(%s, %s)" % (self,x))

   @classmethod
   def class_foo(cls, x):
       print("executing class_foo(%s, %s)" % (cls,x))

   @staticmethod
   def static_foo(x):
       print("executing static_foo(%s)" % (x))

a = A()
a.foo("egon")
A.class_foo(1)
a.static_foo(1)

3.编写程序, 如下有三点要求:
1.自定义用户信息数据结构, 写入文件, 然后读取出内容, 利用json模块进行数据的序列化和反序列化
e.g
{
“egon”:{“password”:“123”,‘status’:False,‘timeout’:0},
“alex”:{“password”:“456”,‘status’:False,‘timeout’:0},
}
2.定义用户类,定义方法db,例如 执行obj.db可以拿到用户数据结构
3.在该类中实现登录、退出方法, 登录成功将状态(status)修改为True,
退出将状态修改为False(退出要判断是否处于登录状态).
密码输入错误三次将设置锁定时间(下次登录如果和当前时间比较大于10秒即不允许登录)
‘’’

import json
import time
class User:
    def __init__(self, name, password):
        self.name = name
        self.password = password
        self.status = False
        self.timeout = 0

    @property
    def db(self):
        with open(self.name+'.txt', 'r', encoding='utf-8') as f:
            data = json.load(f)
        return data

    def save(self):
        obj={ }
        obj[self.name]={ 'password':self.password,'status':self.status,'timeout':self.timeout}
        with open(self.name+'.txt', 'w', encoding='utf-8') as f:
            json.dump(obj,f)

    def login(self):
        with open(self.name+'.txt', 'r+', encoding='utf-8') as f:
            data = json.load(f)
            count = 0
            while count < 3:
                password = input('password>>:').strip()
                if password != data[self.name]['password']:
                    count += 1
                    continue
                else:
                    if data[self.name]['timeout'] != 0:
                        if time.time() - data[self.name]['timeout'] > 10:
                            print('不允许登录了!超时')
                            break
                        else:
                            data[self.name]['status'] = True
                            f.seek(0)
                            f.truncate()
                            json.dump(data, f)
                            print('----welcome----')
                            break
                    else:
                        data[self.name]['status'] = True
                        f.seek(0)
                        f.truncate()
                        json.dump(data, f)
                        print('----welcome----')
                        break

            else:
                data[self.name]['timeout']=time.time()
                f.seek(0)
                f.truncate()
                json.dump(data,f)


    def quit(self):
        with open(self.name+'.txt', 'r+', encoding='utf-8') as f:
            data = json.load(f)
            if data[self.name]['status'] == True:
                data[self.name]['status'] = False
                f.seek(0)
                f.truncate()
                json.dump(data, f)
            else:
                print('您是退出状态!')


alex=User('alex','123')
egon=User('egon','456')
alex.save()
egon.save()
print(alex.db)
print(egon.db)

4.编写程序, A 继承了 B, 俩个类都实现了 handle 方法,
在 A 中的 handle 方法中调用 B 的 handle 方法

class B:
    def handle(self):
        print("i am b")

class A(B):
    def handle(self):
        super().handle()
        print("i am a")

a = A()
a.handle()

5.编写程序, 编写一个学生类, 要求有一个计数器的属性, 统计总共实例化了多少个学生

class Student:
    count = 0
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

        Student.count += 1
    def count_num(self):
        print("实例化了%s个学生" %Student.count)
s1 = Student("a",18,"male")
s2 = Student("b",16,"female")
s3 = Student("c",15,"male")
s1.count_num()

6.使用实例进行 获取、设置、删除 数据, 分别会触发类的什么私有方法

class A(object):
    def __getitem__(self, item):
        return self.__dict__.get(item)
    def __setitem__(self, key, value):
        self.__dict__[key] = value
    def __delitem__(self, key):
        del self.__dict__[key]

a = A()
#设置属性
a["key"] = "val"
print(a.__dict__)
b = a["key"]
print(b)
#删除属性
del a["key"]
print(a.__dict__)

7.人狗大站,2个角色,人和狗,
游戏开始后,生成2个人,3条狗,互相混战,人被狗咬了会掉血,狗被人打了也掉血,
狗和人的攻击力,具备的功能都不一样
class Animal:
def init(self,name,blood,attack):
self.name = name
self.blood = blood
self.attack = attack
def attribute(self,enemy):
self.blood -= enemy.attack
class Dog(Animal):
def attribute(self,enemy):
super().attribute(enemy)
print(“%s attack %s” %(self.name,enemy.name))
class People(Animal):
def attribute(self,enemy):
super().attribute(enemy)
print(“%s attack %s” %(self.name,enemy.name))

d1 = Dog(“二哈”,100,10)
p1 = People(“大壮”,100,20)
d1.attribute(p1)
print(d1.blood)
8.请编写一段符合多态特性的代码

import abc
class Animals(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def talk(self):
        pass
class People(Animals):
    def talk(self):
        print("say hello")
class Dog(Animals):
    def talk(self):
        print("say wangwang")
class Cat(Animals):
    def talk(self):
        print("say miaomiao")
people = People()
dog = Dog()
cat = Cat()

def func(animals):
    animals.talk()
func(people)
func(dog)
func(cat)

9.请执行以下代码,解释错误原因,并修正错误

class Dog(object):

   def __init__(self,name):
       self.name = name

   @property
   def eat(self):
       print(" %s is eating" %self.name)

d = Dog("ChenRonghua")
d.eat

本文地址:https://blog.csdn.net/qq_36993243/article/details/110423181

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐