【Python 继承&封装&反射&异常处理 10】

一、继承

1、语法:子类(父类)

# 学科类:存放学科名,周期,价格
class Course:
    course_lst = []
    def __init__(self,name,period,price):
        self.name = name
        self.period = period
        self.price = price
# 角色:可以查看不同学科的学科名,周期,价格
class Role:
    def __init__(self,name):
        self.name = name

    def show_sourse(self):
        for item in Course.course_lst:
            print(item.name,item.period,item.price)

# students类   -->继承语法:子类(父类),直接在子类后面用括号加父类的方式即可
class Students(Role):
    def __init__(self,name):
        super().__init__(name) #super()可以调用父类的一切属性和方法
        # self.course = []

python = Course('python','6个月',19800)
java =  Course('java','6个月',20000)
Course.course_lst=[python,java]

stu = Students('wusir')
print(stu.name)
stu.show_sourse()

===执行结果===
wusir
python 6个月 19800
java 6个月 20000

二、封装

  • 私有化    用“__”修饰,属性、方法、类都可以私有
  • 私有化以后不能直接被调用,需要用get和set方法进行调用
  • 私有化不能被继承
#私有化:用__修饰,可以属性私有化,方法私有化等

class Student:
    def __init__(self,name):
        self.__name = name #用__把name属性私有化
    def getName(self):
        return self.__name
    def setName(self,value):
        self.__name = value

stu = Student('老王')
stu.setName('赵六')
print(stu.getName())

1、面向对象的装饰器

  • @property 将一个方法伪装成属性
  • @staticmethod 声明方法是一个静态方法,不必传任何默认的参数
  • @classmethod   装饰当前这个方法为一个类方法,默认传参数cls,表示当前所在的类名
# @property 将方法伪装成一个属性
class Circle:
    def __init__(self,r):
        self.r = r

    @property
    def area(self):
        return self.r**2*3.14

c = Circle(5)
print(c.area) #因为用了 @property把方法伪装成一个属性了,所以调用方法时就可以直接调用名字,而不需要再方法名后面加括号了

# @staticmethod 声明一个方法为静态方法,不必传默认的参数
# 不必实例化就可以调用的方法 不需要传递对象作为参数,就定义这个方法为静态方法

class Students:
    def __init__(self,name):
        self.name=name
    # 如果有__init__初始化参数,自定义方法时默认都会加上self(即:会加上默认的参数name)
    def login(self):
        print('====')

    # 如果不想要默认的参数(即:__init__内的参数),可以在方法前加@staticmethod,当然没有默认的参数了,自定义的参数是可以随意增加的
    @staticmethod
    def regirect(falg):
        print('----->')

# @classmethod 装饰当前这个方法为一个类方法,默认传参数cls,表示当前所在的类名
class Manager:
    def __init__(self,name):
        self.name=name
    @classmethod
    def login(cls): #cls就表示Manager类名
        stu = cls.name
        return stu

2、几种方法调用的方式

class A:
    def func(self):  pass  # 实例方法 self作为默认参数,需要用对象来调用

    @classmethod
    def func1(cls):  pass  # 类方法 cls作为默认参数,可以用类名来调用

    @staticmethod
    def func1():  pass  # 静态方法方法 没有默认参数,可以用用类名来调用

 三、内置方法和单例模式

1、__str__

打印一个对象总是打印对象的内存地址,对我们来说没有作用,一般可以用obj.__str__来打印方法的返回值

2、__new__

创建一块空间,在__init__方法之前还有一个创建空间的方法__new__

四、模块和包

 1、模块:多行代码拆成多个py文件,可以随意引用

# 导入模块的话
from 模块 import 变量
import 模块
模块.变量访问变量的值

import demo  #导入一个模块
obj = deom.Manager()  #类实例化

from demo import Manager #导入一个模块的类
obj = Manager()  #类实例化

2、包的导入

  # from 包.包.包 import 模块
        # 模块.xxx直接获取值
    # import 包.包.模块
        # 包.包.模块,xxx获取值

# pack.api两层包,policy是类,name是属性
import pack.api.policy as policy
policy.name

from pack.api import policy
policy.name

注意:# 无论是导入模块还是包,必须要保证被导入的模块和包所在路径在sys.path的列表中

如果sys.path没有的话,可以把需要导入的包加进去

import sys
sys.path.append('/Users/mobvista/Documents/PycharmProjects/pythonProject/day05/dir')
print(sys.path)

不管是导入模块还是导入包,都必须导入到模块(即:py文件),这样才能用模块下的函数或者属性等

五、hashlib模块

import hashlib
# 调用hashlib的md5方法,复制给md
md=hashlib.md5()
# md对123456进行加密:update
md.update(b'123456')
# 获取加密后的内容 :hexdigest()
ret1 = md.hexdigest()
print(ret1) #e10adc3949ba59abbe56e057f20f883e

md5 = hashlib.sha1()
md5.update(b'123456')
ret2 = md5.hexdigest()
print(ret2) #7c4a8d09ca3762af61e59520943dc26494f8941b

# md5加密的结果是32位,sha1的加密结果是40位

为了防止加密后的密码被反向破解,需要加盐处理,并且是动态加盐(经常在用户名里进行加盐)

import hashlib
# 调用hashlib的md5方法,复制给md
md = hashlib.md5('只有我知道,别人不知道的秘密的字符串%s'%'alex'.encode('utf-8'))
# md对123456进行加密:update
md.update(b'123456')
# 获取加密后的内容 :hexdigest()
ret1 = md.hexdigest()
print(ret1) 

 

posted @ 2022-06-02 17:06  尘封~~  阅读(46)  评论(0编辑  收藏  举报