python学习04

class Room:
    def __init__(self,name,length,width):
        self.name=name
        self.length=length
        self.width=width
    def area(self):
         return self.__length*self.__width
    def get_name(self):
        return self.__name
    def set_name(self,newName):
        if type(newName) is str and newName.isdigit() ==False:
            self.__name=newName
        else:
            print('please input vaild  newName')
jin=Room('jin',2,1)
print(jin.area())
jin.set_name('')
#假设父类的私有属性 bu能被子类调用
class Foo:
    __key='123'
class Son(Foo):
    print(Foo._key)
#property
#内置装饰器函数,只在面向对象中使用
from math import  pi
class Circle:
    def __init__(self,r):
        self.r=r
    @property
    def perimeter(self):
         return 2*pi*self.r

    @property#名词是个属性 通过计算得到 不能传任何参数   把fangfa其伪装成方法
    def area(self):
         return  self.r**2*pi
c1=Circle(5)
print(c1.area())
print(c1.area)#去掉括号
class Person:
    def __init__(self,name,high,weight):
        self.name=name
        self.high=high
        self.weight=weight
    @property
    def bmi(self):
        return self.weight/self.high**2
class Person:
    def __init__(self,name):
        self.__name = name
    @property
    def name(self):
        return self.__name+'sb'
    @name.setter
    def name(self,new_name):
        self.__name=new_name
    @name.deleter
    def name(self):
        del self.__name
class Goods:
    discount=0.5
    def __init__(self,name,price):
         self.name=name
         self.price=price
    @property
    def price(self):
         return self.__price*Goods.discount
#method
staticmethod
classmethod
class Goods:
    __discount=0.5
    def __init__(self,name,price):
         self.name=name
         self.price=price
    @property
    def price(self):
         return self.__price*Goods.__discount
    def change_discount(self,new_discount):
           Goods.__discount=new_discount

class Login:
    def __init__(self,name,password):
        self.name = name
        self.pwd=password
    def login(self):pass
    @staticmethod
    def get_usr_pwd():
        usr=input('username:')
        pwd=input('password:')
        Login(usr,pwd)
Login.get_usr_pwd()
#在完全面向对象的程序中,如果一个函数 既和对象没有关系  也和类没有关系 那么就用staticmethod方法
#类方法 有一个默认的参数cls  代表这个类cls
#静态方法 没有默认参数就像函数一样
#反射
name='alex'
'name'
class Teacher:
    dic={'查看学生信息':'','查看讲师信息':''}
    def show_student(self):
        print('show_student')
    def show_teacher(self):
        print('show_teacher')
    @classmethod
    def func(cls):
        print('hahahhah')
alex=Teacher()
for k in Teacher.dic:
    print(k)
key=input('输入需求:')
print(Teacher.dic[key])
if hasattr(alex,Teacher.dic[key]):
    func=getattr(alex,Teacher.dic[key])
    func()
#三个反射函数  hasatrr getattr delattr
#反射:洋浦个字符串类型的命名空间类型的名字 通过他们得到
ret=getattr(Teacher,'dic')#类也是对象Teacher.dic
print(ret)
ret2=getattr(Teacher,'func')#类.方法Teacher.func
print(ret2)
menu=Teacher.dic
for k in menu:
    print(k)
#命名空间:类和对象分别存在不同的命名空间中 且对象能找到类 类找不到对象 对象调用类
#继承 单继承 经典类和新式类  深度优先 广度优先
#super根据mro广度优先顺序找上一个类
#多态  鸭子类型
封装:私有的 双下划线 只在类的内部调用 子类都无法继承
#三个装饰器 @property @staticmethod@classmethod:当一个类只使用了类的静态变量时  就给这个方法加上@classmethod装饰器 默认传cls参数
class Goods:
    __discount=0.09
    @classmethod
    def change_discount(cls):
         cls.__discount=0.4
Goods.change_discount()

 isinstance(obj,cls)检查Obj是否是类cls的对象
class Foo(object):
    pass
obj=Foo()
isinstance(obj,Foo)
issubclass(sub,super)检查sub类是否是super类的派生类
class Foo(object):
    pass
class Bar(Foo):
     pass
issubclass(Bar,Foo)#子类前面
#反射:用字符串类型的名字  去操作变量
eval('print(name)')#安全隐患
#反射:没有安全隐患
name='alex'
#反射对象中的属性和方法
class A:
    def func(self):
        print('in func')
a=A()
a,name='alex'
#反射对象的属性
ret=getattr(a,'name')#t通过变量名的字符串形式取到的值 对象 属性字符串
变量名=input('>>>')
print(getattr(a,'变量名'))
a.__dic__[变量名]
#反射对象的 方法
#a.func()
ret=getattr(a,'func')
ret()
#反射类的属性
class A:
    price=20
    def func(self):
        print('in func')
#A.price
print(getattr(A,'price')) #反射类属性
#反射类的方法:classmethod staticmethod
class A:
    price=20
    @classmethod
    def func(cls):
        print('in func')
#A.func()
print(getattr(A,'func'))
ret=getattr(A,'func')
ret()
ret=getattr(A,'func')()
if hasattr(A, 'func'):
     getattr(A, 'func')()

#反射模块的属性
my.py
day='Monday'#周一
def wahaha():
    print('waaaaaaaaa')
import my
#print(my.day)
print(getattr(my,'day'))
#反射模块的方法
print(getattr(my,'wahaha')())
#内置模块
# 反射自己模块中的变量
def qqxng():
    print('qqxing')
 year=2018
import sys
print(sys.modules['__main__'].yeaar)
getattr(sys.modules['__main__'],'qqxing')#反射自己模块中的变量
print(getattr(sys.modules['__main__'],'year'))
#反射自己模块中的函数方法
getattr(sys.modules['__main__'],'qqxing')()
# 双下方法
# __str__
# __repr__
print(repr(1))
print(repr('1'))
class Teacher:
    def __init__(self,name,salary):
        self.name=name
        self.salary=salary

    def __str__(self):
        return "Teacher's object:%s"%self.name
        return 'A''s object'
    def __repr__(self):
        return str(self.__dict__)

    def func(self):
        return 'wahaha'
    ##pass
    def func(self):
        return 'wahaha'
print('%s:%s'%('A',a))
bazha=Teacher('NAZHA',250)
a=A()
print((repr(nezha)))
print('>>>%r'%nezha)
#object里有一个_str__,一旦被调用,就返回调用这个方法的对象的内存地址
l=[1,2,3,4,7,5,6]
__call__
class A:
    def __call__(self, *args, **kwargs):
        '''

        :param args:
        :param kwargs:
        :return:
        '''
        for k in self.__dict__:

        print('zhixing')
a=A('alex')
a()
class Foo:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def __getitem__(self, item):
        if hasattr(self,item):
            return self.__dict__[item]
    def __setitem__(self, key, value):
         self.__dict__[key]=value
    def  __delitem__(self, key):
        del self.__dict__[key]
f=Foo('egon',38,'man')
print(f['name'])
f['hobby']='man'
print(f.hobby,f['hobby'])
del f.hobby
del f['hobby']
print(f.__dict__)


#__init__初始化方法
#__new__构造方法:创建一个对象
class A:
    def __init__(self):
        self.x=1
        print('in init function')
    def __new__(cls, *args, **kwargs):
        print('in new function')
        return object.__new__(A,*args,**kwargs)
a=A()
print(a.x)
class A:
    __instance=False
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __new__(cls, *args, **kwargs):
        if cls.__instance:
            return cls.__instance
        cls.__instance=object.__new__(A)
        return cls.__instance
class A:
    def __init__(self,name):
        self.name=name
    def __eq__(self, other):
       print(self.other)
       if self.name==other.name:
           return True
       else:
           return False

obj1=A('egon')
obj2=A('egg')
print(obj1==obj2)
__hash__
class A:
    def __init__(self,name):
        self.name=name
a=A('egon')
b=A('egon')
print(hash(a))
print(hash(b))
import json
from collections import namedtuple
Card=namedtuple('Card',['rank','suit'])
class FranchDeck:
    ranks = [str(n) for n in range(2,11)] +list('JQKA')

    suits=['红心','方板','梅花','黑桃♠']
    def __init__(self):
        self.__cards=[Card(rank,suit) for rank in FranchDeck.ranks
                      for suit in  FranchDeck.suits]
        def __len__(self):
            return len(self.__cards)
        def __getitem__(self,item):
            return self.__cards[item]
        def __setitem__(self,key,value):
            self.cards[key]=value
        def __str__(self):
            return json.dumps(self.__cards,ensure_assii=False)
deck=FranchDeck()
print(deck[10])
from random import choice
print(choice(deck))
from random import  shuffle
shuffle(deck)
print(deck[:5])
class A:
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age
    def __eq__(self, other):
        if self.name==other.name and self.sex==other.sex:
            return True
        return False
    def __hash__(self):
        return hash(self.name+self.sex)

a=A('agewa','man',38)
a=A('agewa','man',37)
print(set((a,b)))
#set 依赖对象的hash eq方法
# hashilib
#登陆认证 密码
#摘要算法
import hashlib
md5=hashlib.md5()
sha=hashlib.shal()
sha=hashlib.shal3_512()
md5.update(b'alex31274')
print(md5.hexdigest())
print(sha.hexdigest())
hashlib.md5()
#不管算法多么的不同,摘要的功能始终不变
#对于相同的字符串使用同一个算法进行摘要,得到的值总是不变的
#sha算法随着算法时间复杂度增加  时间成本空间成本增加
密码的密文存储
文件的一致性验证
   #下载的时候  检查我们下载的文件和远程服务器上的文件是否一致
   #两台机器上的连个文件 你想检查者两个文件是否相等

#用户输入用户名
# 用户输入密码
# 明文的密码进行摘要 拿到一个密文密码
# 写入文件

# 用户登陆
import hashlib
usr=input('username:')
pwd=input('password:')
with open('userinfo') as f:
    for line in f:
        user,passwd,role=line.split('|')
        md5=hashlib.md5()
        md5.update(bytes(pwd,encoding='utf-8'))
        md5_pwd= md5.hexdigest()
        if usr == user and md5_pwd == passwd:
            print('登陆成功')

#撞库
import hashlib
md5=hashlib.md5()
md5=hashlib.md5(bytes('salt',encoding='utf-8'))
md5=hashlib.md5(bytes('盐',encoding='utf-8'+b''))
sha=hashlib.shal()
sha=hashlib.shal3_512()
md5.update(b'alex31274')
print(md5.hexdigest())
print(sha.hexdigest())
hashlib.md5()
md5=hashlib.md5()
# configparser模块
#start文件 配置文件 经常会用的的功能封装
from os import getcwd,path
from sys import path as sys_path
sys_path.inser(0,path.dirname(getcwd()))
from core import main
if __name__ == '__main__':
        main.main()
def login():
    '''
    登陆函数,应该先到conf.config文件中读取userinfo的文件路径
    读取usessrinfo文件中的信息,对用户和密码进行查验
    登陆成功之后,查看这个人的身份,来确定进入哪一个视图

    :return:
    '''
    usr=input('username:')
    pwd=input('password:')
    with open(userinfo) as f:
      for line in f:
        usrname,passwd,rple=line.strip().split('|')
        if usrname==usr and passwd==pwd:
            print('\033[1;32m登陆成功!\033[0m')
            return {'username':usr,'role':role}
        else:
            print('\033[1;31m登录失败!\033[0m')
def main():
  """
  打印欢迎信息
  login:得到返回值:用户的姓名 和身份
  打印用户身份对应的功能菜单
  #如果用户想调用任何方法应该通过角色对象调用,跳转到对应的对象的方法里
  :return:
  """
  print('\033[1;42m欢迎您登陆选课系统|033[0m')
  ret=login()
  if ret:
      role_class=getattr(sysmodules[__name__],ret['role'])
      obj=role_class(ret['username'])
      for i,j in enumerate(role_class.menu,1):
          print(i,j[0])
      try:
          ret=int(input('请输入操作序号:'))
          getattr(obj,role_class.meu[ret-1][1])()
      except:
          print('对不起,您输入的内容有误')
from conf.config import *
from core.Teacher import Teacher
from core.my_pickle import MyPickle
class Manger:
    menu=[('创建讲师账号','creatTeacher'),('创建学生账号','creatStudent',
                                     ('创建课程','creatCourse'),('查看课程','showCourse'),
                                     ('创建班级','createClasses'),('查看班级','showClasses'),
                                     ('绑定班级','boundClass'),('退出',''))]
    def __init__(self,name):
        self.name=name
        self.teacher_pickle_obj=MyPickle(teacher_obj)
    @staticmethod
    def userinfo_handle(content):
        with open(userinfo,'a') as f:
            f.write('\n%s'%content)

    def creatTeacher(self):

import pickle
class MyPickle:
   def __init__(self,filename):
       self.filename=filename

    def deum(self,obj):
        with open(self.filename,'ab') as f:
            pickle.dump(obj,f)
    def loaditer(self):
        with open(self.filename,'rb') as f:
            for obj in pickle.load(f)
                yield obj

                

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落雪snowflake

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值