• python学习笔记(对象)


    对象的魔力

    创建自已对象是python非常核心的概念,事实上,python被称为面向对象语言,本章会介绍如何创建对象。以及面向对象的概念:继承、封装、多态。 

    • 多态: 可对不同类的对象使用同样的操作。
    • 封装:对外部世界隐藏对象的工作细节。 
    • 继承:以普通的类为基础建立专门的类对象。

    多态

    多态意味着就算不知道变量所引用的对象类型是什么,还能对它进行操作,而它也会根据对象(或类)类型的不同表现出不同的行为

    多态和方法

    绑定到对象特性上面的函数称为方法

    >>> 'abc'.count('a')
    1
    >>> [1,2,'a'].count('a')
    1
    >>>

    >>> from random import choice
    >>> x=choice(['hello,world',[1,2,'e','e',4]])
    >>> x.count('e')
    2
    >>>

    多态的多种形式

    >>> 1+2
    3
    >>> 'fish'+'license'
    'fishlicense'
    >>> def add(x,y):
    return x+y

    >>> add(1,2)
    3
    >>> add('fish','license')
    'fishlicense'
    >>> def length_message(x):
    print 'The length of ',repr(x),'is',len(x)


    >>> length_message('Fnord')
    The length of 'Fnord' is 5
    >>> length_message([1,2,3])
    The length of [1, 2, 3] is 3
    >>>

    封装

    封装是对全局作用域中其他区域中隐藏多余信息的原则

    >>> c = closedObject()

    >>> c.setName('sir lancelot')

    >>> c.getName()

    ‘sir lancelot’

    继承

    我们不想把同一段代码写好几遍,之前使用的函数避免了这种情况。但现在又有个更微妙的问题。如果已经有了一个类,又想建立一个非常类似的类,只是添加几个方法。

    比如有动物类,我们又想在动物类的基础上建立鸟类、鱼类,哺乳动物类。

    创建自己的类

    _metaclass_=type #确定使用新式类
    class Person:
    def setName(self,name):
    self.name=name

    def getName(self):
    return self.name
    def greet(self):
    print"hello,world! I'm %s ."%self.name

    --------------

    >>> foo=Person()
    >>> bar=Person()
    >>> foo.setName ('Luke Skywalker')
    >>> bar.setName('Anakin Skywalker')
    >>> foo.greet ()
    hello,world! I'm Luke Skywalker .
    >>> bar.greet()
    hello,world! I'm Anakin Skywalker .
    >>>

    >>> foo.name
    'Luke Skywalker'
    >>> bar.name='Yoda'
    >>> bar.greet()
    hello,world! I'm Yoda .
    >>>

    特性、函数和方法

     self 参数事实上正是方法和函数的区别。方法将它们的第一个参数绑定到所属的实例上,因此这个参数可以不必提供。所以可以将特性绑定到一个普通函数上,这样就不会有特殊的self参数了

    class Bird:
    song='Squaawk'
    def sing(self):
    print self.song

    ----------------

    bird=Bird()

    >>> bird.sing()
    Squaawk
    >>> birdsong=bird.sing
    >>> birdsong()
    Squaawk

    指定超类

    子类可以扩展超类的定义。将其他类名写在class语句后的圆括号内可以指定超类:

    class Filter:
    def init(self):
    self.blocked=[]
    def filter(self,sequence):
    return [x for x in sequence if x not in self.blocked]
    class SPAMFilter(Filter):#SPAMFilter是Filter的子类
    def init(self):#重写Filter超类中的方法
    self.blocked=['SPAM']

    ---------------------

    >>> f=Filter()
    >>> f.init()
    >>> f.filter([1,2,3])
    [1, 2, 3]
    >>> s=SPAMFilter()
    >>> s.init()
    >>> s.filter(['SPAM','SPAM','SPAM','SPAM','eggs','bacon','SPAM'])
    ['eggs', 'bacon']
    >>>

    调查继承

    如果想要查看一个类是否是另一个的子类。可以使用内建的issubclass函数:

    >>> issubclass(SPAMFilter,Filter)
    True
    >>> issubclass(Filter,SPAMFilter)
    False
    >>>

    多个超类

    多重继承

    class Calculator:
    def calculate(self,expression):
    self.value=eval(expression)
    class Talker:
    def talk(self):
    print 'Hi,my value is',self.value
    class TalkingCalculator(Calculator,Talker):
    pass

    --------------------

    >>> tc=TalkingCalculator()
    >>> tc.calculate('1+2*3')
    >>> tc.talk()
    Hi,my value is 7
    >>>

    接口和内省

    检查方法是否存在

    >>> hasattr(tc,'talk')
    True
    >>> hasattr(tc,'fnord')
    False
    >>>

  • 相关阅读:
    node-log4js3.0.6配置
    MySQL命令学习
    64位 windows10,MYSQL8.0.13重置密码(忘记密码或者无法登录)
    64位 windows10,安装配置MYSQL8.0.13
    vscode切换界面布局
    一个网站同时监听两个端口
    javascript +new Date()
    es6 解构
    react列表数据显示
    访问禁止,检测到可疑访问,事件编号
  • 原文地址:https://www.cnblogs.com/whats/p/4702506.html
Copyright © 2020-2023  润新知