zoukankan      html  css  js  c++  java
  • 《python基础教程》笔记之 更加抽象

    • 方法、函数和特性

    函数和方法的区别在于self参数,方法(绑定方法)将它们的第一个参数帮顶到所属的实例上,因此这个参数可以不必提供。可以将特性绑定到一个普通函数上,这样就不会有特殊的self参数了,换言之,特性可以绑定到方法上,也可以绑定到函数上,两者的区别便是方法将自己绑定到了一个实例上,如

    >>> class Class:
        def method(self):
            print 'I have'
    >>> def function():
        print 'i do not'
    >>> instance = Clas()
    >>> instance = Class()
    >>> instance.method()
    I have
    >>> instance.method = function
    >>> instance.method()
    i do not

    self参数并不取决于调用方法的方式,目前使用的是实例调用方法,可以随意使用引用同一个方法的其他变量,换言之,self参数的传入,并不仅仅是在实例调用方法时发生,如果方法被其它变量引用,而此变量在使用时,self参数同样会自动传入,如

    >>> class Bird:
        song = 'hello'
        def sing(self):
            print self.song
    
    >>> bird = Bird()
    >>> bird.sing()
    hello
    >>> birdsong = bird.sing
    >>> birdsong()
    hello
    • 私有化的技巧 

    为了让方法或者特性变为私有,只要在它的名字前面加上双下划线即可,而在类的内部定义中,这些名字都被“翻译”成前面加上单下划线和类名的形式;或者使用单下划线,也会有一些实际效果,如不能被带星号的imports语句(from module import *)导入。

    • 类的命名空间

    类的定义其实就是执行代码块,所有位于class语句中的代码都在特殊的命名空间中执行 --- 类命名空间,如

    >>> class C:
        print 'Class C being defined ...'
    
    Class C being defined ...
    >>> class MemberCounter:
        member = 0
        def init(self):
            MemberCounter.member += 1
    
    >>> m1 = MemberCounter()
    >>> m1.init()
    >>> MemberCounter.member
    1
    >>> m2 = MemberCounter()
    >>> m2.init()
    >>> MemberCounter.m
    >>> MemberCounter.member
    2
    • 面向对象模型相关

    草图步骤:

    1. 写下问题的描述(程序要做什么?),把所有名词、动词和形容词加下划线

    2.对于所有名词,用作可能的类

    3.对于所有的动词,用作可能的方法

    4.对于所有的形容词,用作可能的特性

    5.把所有方法和特性分配到类

    精炼模型:

    1.写下(或者想象)一系列的使用实例----也就是程序应用时的场景,试着包括所有的功能

    2.一步步考虑每个使用实例,保证模型包括所有需要的东西。如果有些遗漏的话就添加进来。如果某处不太正确则改正。继续,直到满意为止。

    • 其他

    将其它类名写在class语句后的圆括号内可以指定超类,如

    #Filter是个用于过滤序列的通用类,事实上它不能过滤任何东西
    class Filter:
        def init(self):
            self.block = []
        def filter(self, sequence):
            return [x for x in sequence if x not in self.block]
    #SPAMFilter是Filter的子类,可以将序列中的“SPAM”过滤
    class SPAMFilter(Filter):#SPAMFilter 是 Filter的子类
        def init(self):#重写Filter超类中的init方法
            self.block = ['SPAM']

    结果

    >>> f = Filter()
    >>> f.init()
    >>> f.filter([1,2,3])
    [1, 2, 3]
    >>> s = SPAMFilter()
    >>> s.init()
    >>> s.filter(['SPAM', 'egg', 'bacons', 'SPAM''SPAM''SPAM''SPAM'])
    ['egg', 'bacons', 'SPAMSPAMSPAMSPAM']

    issubclass -- 查看一个类是否是另一个类的子类

    __bases__  -- 获得已知类的基类们

    isinstance  -- 检查一个对象是否是一个类的实例

    __class__ -- 知道一个对象属于哪个类

    hasattr -- 检查所需的方法是否已经存在

    getattr -- 获取对象特性

    setattr -- 设置对象的特性

  • 相关阅读:
    vue cli3的多环境配置
    【Unity】VSync垂直同步
    css控制中文单词不拐行
    Spring aop 自定义注解 注解声明在类上 aop 前置通知不生效?
    校验日期格式{YYYYMMDD的 java代码
    Spring的@ExceptionHandler注解使用方法
    Pointcut注解表达式@target、@annotation、@within、this、target、within等
    Redisson的简单使用
    JoinPoint和ProceedingJoinPoint区别
    自定义注解详细介绍
  • 原文地址:https://www.cnblogs.com/qiantangbanmu/p/4316665.html
Copyright © 2011-2022 走看看