day27軟件開發的規範

========================================開發規範=======================================
    1.軟件開發規範
        1.1目錄結構----有組織的目錄結構
        Project-
            bin
                start.py#啓動腳本
            conf
                setting.py#設置
            db
                mysql.sql#數據庫
            lib
                commons.py#公共的類庫
            log
                log.py#日誌信息
            src/core
                #主要的核心的程序邏輯
========================================call方法=======================================
    class Foo():
        pass
        def __call__(self, *args, **kwargs):
            print('我執行啦obj()')

    f1=Foo()
    f1()#調用的就是__call__方法
========================================doc屬性=========================================
    class Foo():
        '我是描述信息'
        pass
    class Bar():
        pass
    print(Foo.__dict__)
    print(Bar.__dict__)
========================================反射的詳細介紹===================================
    import test as obj
    print(obj)
    print(hasattr(obj,'say_hi'))
    print(hasattr(obj,'say_hissssssssssssssss'))

    if hasattr(obj,'say_hi'):
        func=getattr(obj,'say_hi')
        func()
    else:
        print('其他的函數')

    import sys
    print('來自自己的函數')
    b1=sys.modules[__name__]


    # import fangse as obj1
    import sys
    obj1=sys.modules[__name__]
    print('你好',hasattr(obj1,'x'))
========================================file文件========================================
    import sys
    #print(sys.argv)#獲取平臺獲取當前的文件路徑
    sys.exit()
    sys.version
    sys.path
    sys.stdin
    sys.stdout
    sys.stderror
========================================getattribute====================================
    class Foo():
        def __init__(self,x):
            self.x=x

        def __getattr__(self, item):
            print('執行的是我')
        def __getattribute__(self, item):
            print('執行的是getattribute')
            raise AttributeError('拋出異常啦')

    f1=Foo(10)
    f1.xxx#執行找不到的屬性訪問執行getattr方法
    f1.x
    #調用首先執行—- __getattribute方法,不存在的情況下執行
========================================getattribute補充================================
    print('----------------------')
    print('----------------------')
    print('----------------------')
    # class Foo():
    #     def __init__(self,x):
    #         self.x=x
    #
    #     def __getattr__(self, item):
    #         print('執行的是我')
    #     def __getattribute__(self, item):
    #         print('執行的是getattribute')
    #         raise AttributeError('拋出異常啦')
    #
    # f1=Foo(10)
    # f1.xxx#執行找不到的屬性訪問執行getattr方法
    # f1.x
    # #調用首先執行—- __getattribute方法,不存在的情況下執行
    raise AttributeError('自己找事')

    print('----------------------')
    print('----------------------')
    print('----------------------')
========================================index方法=======================================
    from lib.aa import C
    c1=C()
    print(c1.name)
    print(c1.__module__)#來之哪一個模塊
    print(c1.__class__)#來之哪一個類產生

========================================item系列方法====================================
    class Foo():
        def __getitem__(self, item):
            print('getitem')
        def __setitem__(self, key, value):
            print('setitem')
        def __delitem__(self, key):
            print('delitem')

    f1=Foo()
    print(f1.__dict__)
    #通過點訪問的死 getattr
    #當調用字典的時候才調用item

    f1['name']='eoulen'
    f1['age']=18
    print('---->>>',f1.__dict__)
    del f1['name']
    print(f1.__dict__)
========================================slots方法========================================
    #__slots__是什麼:是一個類變量,變量值可以使列表,元組,
    class Foo():
        __slots__ = {'name','age'}
    f1=Foo()

    print(Foo.__slots__)
    print(f1.__slots__)

    #使用__slots主要是進行內存的減小
    f1.name='oulen'
    f1.age=18
    #f1.gender='male'/////AttributeError: 'Foo' object has no attribute 'gender'
    #噹噹前的類存在__slots__ , __dict__不會被使用
========================================內置函數=========================================
    class Foo():
        pass
    class Bar(Foo):
        pass
    f1=Foo()
    print(isinstance(f1,Foo))#檢查obj是否是CLS類的實例
    print(issubclass(Foo,Bar))#檢查Foo是否是繼承BAR
========================================描述符===========================================
    class Foo():
        def __get__(self, instance, owner):
            print('get方法')
        def __set__(self, instance, value):
            print('set方法')
            instance.__dict__['x']=value
        def __delete__(self, instance):
            print('delete方法')
    f1=Foo()
    f1.name='oulen'
    #當前的實例方法不會觸發這個方法
    #用來代理另外一個類的屬性的時候
    class Bar():
        x=Foo()#當另外一個類的屬性是另外一個類
        #在何地
        def __init__(self,n):
            self.x=n
    b1=Bar(11)
    print(b1.x)
    print(b1.__dict__)
    b1.x=18
    #del b1.x

    print(b1.__dict__)

    #數據描述符號
    #有__set__數據描述符
    #沒有__set__就是非數據描述符
    #描述符必須在新式類中


    #注意事項:
    #1.類屬性
    #2.數據描述符
    #3.實例屬性
    #4.非數據描述符
    #5.找不到屬性觸發__getattr__()
========================================描述符優先級======================================
    class Foo:
        def __get__(self, instance, owner):
            print('===>get方法')
        def __set__(self, instance, value):
            print('===>set方法',instance,value)
            # instance.__dict__['x']=value #b1.__dict__
        def __delete__(self, instance):
            print('===>delete方法')


    class Bar:
        x=Foo() #在何地?

    Bar.x=1
    print(Bar.x)
    #----------------優先級的定義
    #注意事項:
    #1.類屬性
    #2.數據描述符
    #3.實例屬性
    #4.非數據描述符 沒有__set__方法
    #5.找不到屬性觸發__getattr__()
    b1=Bar()#
    b1.x #get
    b1.x=1 #set
    del b1.x #delete

========================================改變對象的字符串顯示===============================
    # l=list('hello')
    # print(1)
    # file=open('test.txt','w')
    # print(file)
    #
    # class Foo():
    #     def __init__(self,name,age):
    #         self.name=name
    #         self.age=age
    #     def __str__(self):
    #         return '名字是%s 年齡是%s'%(self.name,self.age)
    #     # def __str__(self):
    #     #     return "自定製的顯示方式"
    # f1=Foo('engon',18)
    # print(f1)
    # print(f1.name)#--str __ f1.str
    # x=str(f1)
    # print(x)


    class Foo():
        def __init__(self,name,age):
            self.name=name
            self.age=age
        # def __str__(self):
        #     return '名字是%s 年齡是%s'%(self.name,self.age)
        # def __str__(self):
        #     return "自定製的顯示方式"
        def __repr__(self):
            return '名字是%s 年齡是%s'%(self.name,self.age)
    f1=Foo()
    #repl 用於在解釋器使用
    #str 使用的是print 使用   print -str _>>  沒有的情況下選擇到 __repl__的方法

    #
    '''
    str 函數或者是print 函數 ——》》 obj.__str__()
    repr 或是解釋器交互式——————》》obj.__repr__()
    如果定義的__str__沒有被定義,那麼就使用__repr__來代替輸出
    注意這兩者的方法的返回值必須是字符串,否則拋出異常

    '''
========================================析構方法==========================================
    class Foo():
        def __init__(self,name):
            self.name=name
        def __del__(self):
            print('我執行啦')
    f1=Foo('oulen')
    del f1.name
    print('-----------》》》》》》')
========================================自定製格式化方法===================================
    # x='{0}{0}{0}'.format('dog')
    #
    # print(x)
    #
    formate_dic={
        'ymd':'{0.year}:{0.mon}:{0.day}',
        'm-d-y':'{0.year}:{0.mon}:{0.day}',
        'y:m:d':'{0.mon}-{0.day}-{0.year}'
    }
    class Date:
        def __init__(self,year,mon,day):
            self.year=year
            self.mon=mon
            self.day=day
        def __format__(self, format_spec):
            print('我執行啦')
            print('我執',format_spec)
            if not format_spec or format_spec not in formate_dic:
                format_spec='ymd'
            fm=formate_dic[format_spec]
            return fm.format(self)
            #return '{0.year}:{0.mon}:{0.day}'.format(self)

    d1=Date(2016,12,26)
    format(d1)
    print(format(d1))
    print(format(d1,'y:m:d'))
    print(format(d1,'m-d-y'))
    print(format(d1,'m-d'))
    #
    # x='{0.year}:{0.mon}:{0.day}'.format(d1)
    # print(x)
    # y='{0.year}:{0.mon}:{0.day}'.format(d1)
    # z='{0.mon}-{0.day}-{0.year}'.format(d1)
    # print(x)
    # print(y)
    # print(z)
    #

========================================迭代器協議=========================================
    class Foo():
        def __init__(self,n):
            self.n=n
        def __iter__(self):
            print('你好')
            return self
        def __next__(self):
            if self.n==13:
                raise StopIteration('終止啦')
            self.n+=1
            return self.n


    # l=list('hello')
    # for i in l:
    #     print(i)
    #
    f1=Foo(10)
    print(f1.__next__())
    print(f1.__next__())
    print(f1.__next__())
    print(f1.__next__())
    print(f1.__next__())
    print(f1.__next__())
    print(f1.__next__())
    # for i in f1:#iter(f1)---------f1.__iter()
    #     print(i)
========================================迭代器實現斐波那契數列==============================
    class Fib():
        def __init__(self):
            self._a=1
            self._b=1

        def __iter__(self):
            return self
        def __next__(self):
            if self._a > 5000:
                raise StopIteration('終止啦')
            self._a,self._b=self._b,self._a+self._b
            return self._a
    f1=Fib()
    print(next(f1))
    print(next(f1))
    print(next(f1))
    print(next(f1))
    print(next(f1))
    print(next(f1))
    for i in f1:
        print(i)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章