zoukankan      html  css  js  c++  java
  • Python基础教程笔记——第7章:更加抽象(类)

    下面进入Python的面向对象:

    对象的魔力:

    多态:---可以对不同类的对象使用同样的操作

    封装:---对外部隐藏对象内部的工作方式

    继承:---以普通的类为基础建立专门的类对象

    (1)多态:

    isinstance(...)
    isinstance(object, class-or-type-or-tuple) -> bool   检查object的类型

    isinstance(object, tuple) 检查是否为元组

    绑定到对象上的函数称为方法   例如>>> [1,2,'a','1','a'].count('a')  2

    repr(object) -> string   一种多态的方式,无论什么转化为字符串

    (2)封装

    (3)继承

    7.2 类和类型

    (1)创建使用自己的类

     1 __metaclass__=type
     2 
     3 class Person:
     4     def setName(self,name):#这个self变量作为第一个参数传入函数,来绑定对象
     5         self.name=name
     6     def getname(self):
     7         return self.name
     8     def greet(self):
     9         print("hello word my name is %s" % self.name)
    10 
    11 #类的使用        
    12 >>> foo=Person()#实例化一个对象
    13 >>> foo.setName("yanliang")#调用对象的方法
    14 >>> foo.getname()
    15 'yanliang'
    16 >>> foo.greet()
    17 hello word my name is yanliang
    18 
    19 #特性是可以在外部访问的(这里和C++的私有成员有点区别)
    20 >>> foo.name='yan'
    21 >>> foo.getname()
    22 'yan'

     (2)特性,函数,方法

    1. 前面的self参数正是方法和函数的区别了,方法可以将它的的一个参数绑定到它的实例上,而函数没有

        但是这个参数也是可以不用提供的,就没有了self参数了

     1 #__metaclass__=type
     2 class class1:
     3     def method(self):
     4         print("yanliang")
     5 
     6 def func():
     7     print("yan")
     8 
     9 
    10 >>> a=class1()
    11 >>> a.method()
    12 yanliang
    13 >>> a.method=func#可以将特性绑定到普通的函数身上
    14 >>> a.method()
    15 yan
     1 class bird:
     2     sing="yanliang"
     3     def singing(self):
     4         print(self.sing)
     5         
     6 #调用上面类的函数
     7 >>> bird1=bird()
     8 >>> bird1.singing()
     9 yanliang
    10 
    11 #可以将对象的变量赋值给别人
    12 >>> a=bird1.sing
    13 >>> a
    14 'yanliang'
    15 
    16 #可以将对象的方法绑定到一个变量上去(还需要对self参数的访问)
    17 >>> birdsing=bird1.singing
    18 >>> birdsing()
    19 yanliang

    对象内部成员的私有化

    Python不直接支持私有的方式:

    让特性或者方法变成私有只要在它的前面加上双下划线就可以了。

    1 class pclass:
    2     __val1="yanliang"
    3 
    4     def __fun1(self):
    5         print(self.__val1)
    6 
    7     def fun2(self):
    8         self.__fun1()
    9 #当调用这个类对象时,外部对__val1特性和__fun1方法是没有权利的   

    类的定义其实就是只是在执行代码块

    类里面的所有实例访问的变量和实例自己所拥有的变量:

     1 class class1:
     2     members=0;
     3     def init(self):
     4         class1.members+=1
     5 
     6 >>> a=class1()
     7 >>> a.init()
     8 >>> class1.members#这里有点类似于C++的静态成员变量
     9 1
    10 >>> b=class1()
    11 >>> b.init()
    12 >>> class1.members
    13 2
    14 
    15 >>> a.members="yanliang"#这里类似于C++一般的数据成员变量
    16 >>> a.members
    17 'yanliang'
    18 >>> class1.members
    19 2

     超类(基类)

    在定义时在类名后面加一个括号,括号里面为超类。

     1 class class1:
     2     def init(self):
     3         self.num="yan"
     4     def print1(self):#子类直接继承基类的print1函数,就不需要再写了
     5         print(self.num)
     6 
     7 class class2(class1):
     8     def init(self):#这里的子类class2会重写超类的init函数
     9         self.num="yanliang"
    10         
    11 >>> a=class1()
    12 >>> a.init()
    13 >>> a.print1()
    14 yan
    15 
    16 >>> b=class2()
    17 >>> b.init()
    18 >>> b.print1()
    19 yanliang

    可以采用内建的>>> issubclass(class2,class1) 函数来判断一个类是否是另外一个类的子类

    可以采用>>> class2.__bases__来找到已知类的所有基类(<class '__main__.class1'>,)

    可以采用>>> isinstance(a,class1)来判断一个对象是否是一个类的实例

  • 相关阅读:
    重定向 重写
    php 安装 event 和 libevent 扩展
    curl 和 tcpdump
    yum 升级php版本
    shell 教程
    shell脚本 inotify + rsync 同步脚本
    nodesj中 中间件express-session的理解
    node.js中express-session配置项详解
    我对面向对象的理解
    BootstrapValidator
  • 原文地址:https://www.cnblogs.com/yanliang12138/p/4713308.html
Copyright © 2011-2022 走看看