zoukankan      html  css  js  c++  java
  • Python基础第18天

    一:多态  指出了对象如何通过他们共同的属性和动作来操作及访问,不用考虑他们具体的类,反映执行时的一种状态

    eg.    len(str1)  -------------->  str1.__len__()

    class H2O:
        def __init__(self,name,temperature):
            self.name=name
            self.temperature=temperature
        def turn_ice(self):
            if self.temperature<0:
                print('[%s]温度太低结冰了'%self.name)
            elif self.temperature>0 and self.temperature<100:
                print('[%s]液化成冰'%self.name)
            elif self.temperature > 100:
                print('[%s]温度太高成了水蒸气'%self.name)
    class Water(H2O):
        pass
    class Ice(H2O):
        pass
    class Steam(H2O):
        pass
    
    w1=Water('',25)
    
    i1=Ice('',-20)
    
    s1=Steam('蒸汽',3000)
    
    # w1.turn_ice()
    # i1.turn_ice()
    # s1.turn_ice()
    
    def func(obj):
        obj.turn_ice()
    
    func(w1)
    func(i1)
    func(s1)

    二 :封装  本质是明确地区分内外,内部的实现逻辑,外部无法知晓,且为封装到内部的逻辑提供了一个访问接口给外部使用

    类的继承  ①  改变   ② 扩展

    多态就是累的两层意义的一种具体的实现机制,即调用不同类实例化得到对象的相同方法,实现的过程不一样。

    面向对象优点:  封装明确了内外

                         继承+多态语言层面支持了归一化设计

    class People:
        __star='earth'
        def __init__(self,id,name,age,salary):
            self.id=id
            self.name=name
            self.age=age
            self.salary=salary
        def get_id(self):
            print('我是私有方法,我找到的id是[%s]'%self.id)
    
        def get_star(self):
            print(self.__star)
    
    
    p1=People('123456','alex','18',10000000)
    # print(p1._star)
    # print(p1.__star)#出错,原因是python自动重命名了
    print(People.__dict__)
    print(p1._People__star)
    p1.get_star()  #内部就可以调用
    class Room:
        def __init__(self,name,owner,width,length,heigh):
            self.name=name
            self.owner=owner
            self.__width=width
            self.__length=length  #隐藏,私有
            self.__heigh=heigh
    
        def tell_area(self):
            return self.__width*self.__length*self.__heigh
    r1=Room('厕所','alex',100,100,100000)
    print(r1.tell_area())
    封装示范

    三:反射(自省)

    这四种方法都是基于字符串的,四种方法实现自省的功能

    • hasattr   检测对象能不能调用到里面的属性或方法
    • getattr    
    • setattr    设置属性
    • delattr    删除
    class BlackMedium:
        feature='Ugly'
        def __init__(self,name,addr):
            self.name=name
            self.addr=addr
    
        def sell_hourse(self):
            print('[%s]正在买房子,sb才买呢'%self.name)
        def rent_hourse(self):
            print('[%s]正在租房子,sb才租房'%self.name)
    
    b1=BlackMedium('万成置地','天露园')
    
    print(hasattr(b1,'name')) #判断object中有没有一个name字符串对应的方法或属性
    print(hasattr(b1,'sell_hpurse'))    #能不能调用该方法
    
    print(getattr(b1,'name'))
    func=getattr(b1,'rent_hourse')
    func()
    
    print(getattr(b1,'rent_hoursefghj')) #没有则会报错
    print(getattr(b1,'rent_hoursefghj','没有这个属性')) #设置默认参数,不会报错
    setattr(b1,'sb',True)
    setattr(b1,'sb1',123)
    print(b1.__dict__)
    
    delattr(b1,'sb')
    print(b1.__dict__)
    setattr(b1,'func',lambda x:x+1)  #设置函数属性
    setattr(b1,'func1',lambda self:self.name+'sb')
    print(b1.__dict__)
    print(b1.func(10))
    print(b1.func1(b1))

    四:反射及动态导入模块

    #t.py
    def test1():
        print('test1')
    
    def _test2():  #私有
        print('test2')

    按字符串导入:

    module_t=__import__('m1.t')  #传入字符串,提取模块名,拿到的都是最顶层的那个
    print(module_t)
    module_t.t.test1()#一步一步往下调用

    封装私有属性:

    from m1.t import *  #只有这种情况下_test2()才报错
    from m1.t import test1,_test2
    test1()
    # test2()#报错
    _test2() #不报错,说明python只是遵守某种约定不是真的限制

    利用模块导入:

    import importlib
    m=importlib.import_module('m1.t')  #定位到所导的模块,所以不要m.t.test
    print(m)
    m.test1()
    m._test2()
  • 相关阅读:
    tlb、tlh和tli文件的关系
    String算法
    Reverse A String by STL string
    windows内存管理复习(加深了理解得很!)
    [转载]有关DLL中New和外部Delete以以及跨DLL传递对象的若干问题
    顺势工作时间
    C++箴言:绝不在构造或析构期调用虚函数
    inline函数复习
    从编译器的角度更加深入考虑封装的使用
    复习:constructor和destructor的compiler实现
  • 原文地址:https://www.cnblogs.com/xyd134/p/6534508.html
Copyright © 2011-2022 走看看