多态,多继承,包和模块

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:本文主要介绍包和模块的概念


提示:以下是本篇文章正文内容,下面案例可供参考

一、多继承和多继承的顺序

在这里插入图片描述

class Person:
    def __init__(self,name):
        self.name=name
    def eat(self):
        print('------>eatl')
    def eat(self,food):
        print('---------------->eat',food)
p=Person('jack')
p.eat('狮子头')
'''
以上代码为举例说明:
怎么进行覆盖
'''
class Base:
    def test(self):
        print('----->BASE-------')
class A(Base):
    def test(self):
        print('--->AAAAAAAA')
class B(Base):
    def test(self):
        print('------->BBBBBBB')
class C(Base):
    def test(self):
        print('--------->CCCCC')

class D(A,B,C):
    pass
d=D()
d.test()
import inspect
print(inspect.getmro(D))
print(D.__mro__)
# 结果操作顺序: (<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.Base'>, <class 'object'>)
# c=C()
# c.test1()
# c.test()
# c.test2()

在这里插入图片描述

#多继承的搜索顺序,经典类,新式类
#从左至右 深度优先
#广度优先
class P1:
    def foo(self):
        print('p1--->foo')
    def bar(self):
        print('p1--->bar')
class P2:
    def foo(self):
        print('p2---->foo')
class C1(P1,P2):
    pass

class C2(P1,P2):
    def bar(self):
        print('C2--->bar')

class D(C1,C2):
    pass

d=D()
d.foo()
d.bar()
print(D.__mro__)

二、多态的概念

'''
 私有化:
    __age
    def __show(self):
        pass

    ---> _类名_属性

  私有化: 封装  将属性私有化,定义公有set和get方法
  def setAge(self,age):
      判断
  def getAge(self):
     return self.__age

  s.setAge(20)
  s.getAge()

  class Student:
      def __init__(self,age):
            self.__age=age

      @property
      def age(self):
        return ...

      @age.setter
      def age(self,age):
        self.__age=age

  s= Student()
  s.age=10
  print(s.age)


 继承:
   has a
   class Student:
     def __init__(self,name,book):
        pass

   is a
    父类   子类
    class Person:
        def run(self):
            ....

    class Student(Person):
        ....

        def study(self):
            ....

        def run(self):
            super().run()
            .....

    s= Student()
    s.study()
    s.run()


    1. __init__
    2. 重写方法

  多继承:(了解)
    class A:
        pass
    class B:
        pass
    class C(A,B):
        pass
    现在执行环境python3

    新式类: 广度优先

    D.__mro__  --->查看搜索顺序
    import inspect
    print(inspect.getmro(D))

'''

#   封装  继承  多态 ----》 面向对象
class Person:
    def __init__(self, name):
        self.name = name

    def feed_pet(self, pet):  # pet既可以接收cat,也可以接收dog,还可以接收tiger
        # isinstance(obj,类)  ---》 判断obj是不是类的对象或者判断obj是不是该类子类的对象
        if isinstance(pet, Pet):
            print('{}喜欢养宠物:{},昵称是:{}'.format(self.name, pet.role, pet.nickname))
        else:
            print('不是宠物类型的。。。。')


class Pet:
    role = 'Pet'

    def __init__(self, nickname, age):
        self.nickname = nickname
        self.age = age

    def show(self):
        print('昵称:{},年龄:{}'.format(self.nickname, self.age))


class Cat(Pet):
    role = '猫'

    def catch_mouse(self):
        print('抓老鼠....')


class Dog(Pet):
    role = '狗'

    def watch_house(self):
        print('看家高手....')


class Tiger:
    def eat(self):
        print('太可怕了,可以吃人...')


# 创建对象
cat = Cat('花花', 2)

dog = Dog('大黄', 4)

tiger = Tiger()

person = Person('家伟')

person.feed_pet(cat)
person.feed_pet(dog)
print('----------------------------')
person = Person('pengpeng')

person.feed_pet(tiger)

# Pet
#  pet  父类      cat   dog 子类
#  pet  大类型    cat  dog 小类型

# 封装 继承 多态
class Person:
    def __init__(self,name):
        self.name=name
    def feed_pet(self,pet): # pet既可以接收cat,也可以接收dog,还可以接收tiger
        #判断对象是不是这个类或者这个类的子类
        if isinstance(pet,Pet):
            print('{}喜欢养宠物{},昵称是{}'.format(self.name,pet.role,pet.nickname))
        else:
            print('不是宠物类型的')
class Pet:
    role='pet'
    def __init__(self,nickname,age):
        self.nickname=nickname
        self.age=age

    def show(self):
        print('昵称:{},年龄:{}'.format(self.nickname,self.age))
class Cat(Pet):
    role='猫'
    def catch_mouse(self):
        print('捉老鼠')
class Dog(Pet):
    role='狗'
    def watch_house(self):
        print('看家高手')
class Tiger:
    def eat(self):
        print('太可怕了,可以吃人')

#创建对象
cat=Cat('花花',2)
dog =Dog('大黄',4)
tiger=Tiger()
person=Person('佳明')

person.feed_pet(cat)

person=Person('阿奇')
person.feed_pet(tiger)

三 什么是单例?

在这里插入图片描述

#单例模式:
#开发模式:单例模式,对内存进行优化.

class Student:
    pass


s=Student()


s1=Student()

#每创建一个实例都需要去开辟一块内存空间
# print(s)
# print(s1)
# print(s2)


class Singleton:
    #私有化  单例的地址就存在于__instance
    __instance= None
    name='jack'

    #重写__new__

    def __new__(cls):
        print('------->__new__')
        if cls.__instance is None:
            print('---->1')
            cls.__instance=object.__new__(cls)  #__new__产生一个内存空间
            print(cls.__instance)
            return  cls.__instance
        else:
            print('-------->2')
            return cls.__instance
    def show(self,n):
        print('----->show',Singleton.name,n)

s=Singleton()
s1=Singleton()
print(s)
print(dir(Singleton))
print(s1)

s1.show(5)
s.show(7)

四 模块的使用?

'''
在python中,模块是代码组织的一种方式,把功能接近的函数放到一个文件,一个文件(.py)就是一个模块(module).
模块名就是文件名去掉后缀py,这样做的好处是

-提高代码的可复用,可维护性,一个模块编写完毕后,可以很方便的在其他项目中导入
-解决了命名冲突,不同模块和相同命名不会冲突


常用标准库:

| 标准库          | 说明                 |
| --------------- | -------------------- |
| builtins        | 内建函数默认加载     |
| math            | 数学库               |
| random          | 生成随机数           |
| time            | 时间                 |
| datetime        | 日期和时间           |
| calendar        | 日历                 |
| hashlib         | 加密算法             |
| copy            | 拷贝                 |
| functools       | 常用的工具           |
| os              | 操作系统接口         |
| re              | 字符串正则匹配       |
| sys             | Python自身的运行环境 |
| multiprocessing | 多进程               |
| threading       | 多线程               |
| json            | 编码和解码 JSON 对象 |
| logging         | 记录日志,调试       |

1. 自定义模块
2. 使用系统一些模块


导入模块:
1. import 模块名
    模块名.变量    模块名.函数    模块名.类
2. from 模块名 import 变量 | 函数 | 类
    在代码中可以直接使用变量,函数,类
3. from 模块名 import *
   该模块中所有的内容
   但是如果想限制获取的内容,可以在模块中使用__all__=[使用*可以访问到内容]
4. 无论是import还是from的形式,都会将模块内容进行加载
   如果不希望其进行调用。就会用到__name__
   在自己的模块里面__name__叫: __main__
   如果在其他模块中通过导入的方式调用的话:__name__: 模块名

'''
list1=[4,2,7,8,9]

# 导入模块
import calculate

#使用模块中的函数,模块名.变量 模块名.类 模块名.函数
result=calculate.add(*list1)
print(result)
# 使用模块的变量
print(calculate.number)

#使用模块中的类
cal=calculate.Calculate(88)
cal.test()
cal.test1()
from calculate import Calculate,add,number
result =add(*list1)
print(result)

sum=result+number
print(sum)

c=Calculate(80)
c.test()

自定义的模块

__all__=['add','number']


#变量
number=100
name='calculation'


def add(*args):
    if len(args)>1:
        sum =0
        for i in args:
            sum+=1
        return sum
    else:
        print('至少传入两个参数')
        return 0
def minus(*args):
    if len(args)>1:
        m=0
        for i in args:
            m-=1
        return m
    else:
        print('至少传入两个参数')

def multiply(*args):
    pass


def divide(*args):
    pass

#类
class Calculate:
    def __init__(self,num):
        self.num=num

    def test(self):
        print('正在使用Calculate进行运算')

    @classmethod
    def test1(cls):
        print('-------->类中的方法')
def test():
    print('我是测试.....')
print('__name__:',__name__)
if __name__=='__main__':
    print(__name__) #  __name__  ---->__main__
    test()

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值