美文网首页
2018-12-04

2018-12-04

作者: Karl_2c80 | 来源:发表于2018-12-04 22:57 被阅读0次

    类和对象

    • 类是对事物的抽象,对象是类的一个实例
    • 面向对象的主要思想:
      1. 封装
      2. 继承
      3. 多态

    类定义

    • 类把需要的变量和函数组合到一起,这种包含称为“封装 ”
    • class A(object):
    • 类的结构:
      • 成员变量 - 属性
      • 成员函数 - 方法

    类的属性

    • 类的属性分为公有属性和私有属性
    • 以双下划线开头的为私有属性,如__atrr
    • 公有属性在类中和类外都能调用
    • 私有属性不能在类外调用
    • 在类外可通过 instance._classname__attribute 方式访问私有属性,一般用作测试
    • 内置属性:由系统在定义类时默认添加的,有前后双下划线构成

    类的方法

    • 类的方法和普通函数的最大区别在于:至少有一个参数self
    • 类的方法有如下几种:
      1. 公有方法:在类中和类外都能调用
      2. 私有方法:不能在类外调用,以双下划线开头 __func()
      3. 类方法:被classmethod()函数处理过的方法,除能被对象调用外,也能被类调用
      4. 静态方法:被staticmethod()函数处理过的方法,相当于“全局函数”,可被类直接调用,也可被所有实例化对象所调用,静态方法没有self参数
    #!/usr/bin/python
    #coding:utf8
    
    class MyClass(object):
        name = 'Karl'
        id = 007
        __age = 18
    
        def think(self):
            self.__age = 28
            print "My name is %s" %self.name
            print "My age is %s" %self.__age
    
    me = MyClass()
    print me.id
    me.think()
    
    [root@KARL ~]# python u3.py
    7
    My name is Karl
    My age is 28
    
    #!/usr/bin/python
    #coding:utf8
    
    class MyClass(object):
        name = 'Karl'
        id = 007
        __age = 18
    
        def think(self):
            self.__age = 28
            print "My name is %s" %self.name
            print "My age is %s" %self.__age
    
    me = MyClass()
    print me.id
    me.think()
    # print me.__age        ## 在类外无法直接调用类中的私有属性
    print '*'*20
    print me._MyClass__age          ## 不推荐这样使用,一般用作测试
    
    [root@KARL ~]# python u3.py
    7
    My name is Karl
    My age is 28
    ********************
    28
    
    class MyClass(object):
        name = 'Karl'
        id = 007
        __age = 18
    
        def think(self):
            self.__age = 28
            print "My name is %s" %self.name
            print "My age is %s" %self.__age
    
    me = MyClass()
    #me.think()
    print '*'*20
    print me.__dict__
    
    [root@KARL ~]# python u3.py
    ********************
    {}
    
    #!/usr/bin/python
    #coding:utf8
    
    class MyClass(object):
        name = 'Karl'
        id = 007
        __age = 18
    
        def think(self):
            self.__age = 28
            print "My name is %s" %self.name
            print "My age is %s" %self.__age
    
    me = MyClass()
    me.think()
    print me.name
    print me.id
    print '*'*20
    print me.__dict__
    
    [root@KARL ~]# python u3.py
    My name is Karl
    My age is 28
    Karl
    7
    ********************
    {'_MyClass__age': 28}
    
    #!/usr/bin/python
    #coding:utf8
    
    class MyClass(object):
        name = 'Karl'
        id = 007
        __age = 18
    
        def think(self):
            self.__age = 28
            name = 'John'
            print "My name is %s" %self.name
            print "My age is %s" %self.__age
    
    me = MyClass()
    print '*'*20
    print MyClass.name      # 直接通过类获取类的属性
    
    [root@KARL ~]# python u3.py
    ********************
    Karl
    
    ▽
    #!/usr/bin/python
    #coding:utf8
    
    class MyClass(object):
        name = 'Karl'
        id = 007
        __age = 18
    
        def think(self):
            self.__age = 28
            name = 'John'
            print "My name is %s" %self.name
            print "My age is %s" %self.__age
    
    me = MyClass()
    me.id = 123
    print '*'*20
    print MyClass.name      # 直接通过类获取类的属性
    print MyClass.id
    print me.id
    
    [root@KARL ~]# python u3.py
    ********************
    Karl
    7
    123
    
    #!/usr/bin/python
    #coding:utf8
    
    class MyClass(object):
        name = 'Karl'
        id = 007
        __age = 18
    
        def think(self):
            self.__age = 28
            name = 'John'
            print "My name is %s" %self.name
            print "My age is %s" %self.__age
    
    me = MyClass()
    me.id = 123
    print '*'*20
    print MyClass.name      # 直接通过类获取类的属性
    print MyClass.id
    print me.id
    print '#'*20
    print MyClass.__dict__
    
    [root@KARL ~]# python u3.py
    ********************
    Karl
    7
    123
    ####################
    {'__module__': '__main__', 'name': 'Karl', 'think': <function think at 0x7fc9aec715f0>, '_MyClass__age': 18, '__doc__': None, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, 'id': 7}
    
    #!/usr/bin/python
    #coding:utf8
    
    class MyClass(object):
        name = 'Karl'
        id = 007
        __age = 18
    
        def think(self):
            self.__age = 28
            name = 'John'
            print "My name is %s" %self.name
            print "My age is %s" %self.__age
    
        def __secret(self):
            print "I can tell you a secret!"
    
        def tell(self):
            self.__secret()
    
        cm = classmethod(tell)   # classmethod不能处理私有方法
    
    me = MyClass()
    print '*'*20
    me.tell()
    print '#'*20
    MyClass.cm()
    
    [root@KARL ~]# python u3.py
    ********************
    I can tell you a secret!
    ####################
    Traceback (most recent call last):
      File "u3.py", line 27, in <module>
        MyClass.cm()
      File "u3.py", line 19, in tell
        self.__secret()
    TypeError: unbound method __secret() must be called with MyClass instance as first argument (got nothing instead)
    
    #!/usr/bin/python
    #coding:utf8
    
    class MyClass(object):
        name = 'Karl'
        id = 007
        __age = 18
    
        def think(self):
            self.__age = 28
            name = 'John'
            print "My name is %s" %self.name
            print "My age is %s" %self.__age
    
        def __secret(self):
            print "I can tell you a secret!"
    
        def tell(self):
            self.__secret()
    
        cm = classmethod(think)
    
    me = MyClass()
    print '*'*20
    me.tell()
    print '#'*20
    MyClass.cm()
    
    [root@KARL ~]# python u3.py
    ********************
    I can tell you a secret!
    ####################
    My name is Karl
    My age is 28
    
    #!/usr/bin/python
    #coding:utf8
    
    class MyClass(object):
        name = 'Karl'
        id = 007
        __age = 18
    
        def think(self):
            self.__age = 28
            name = 'John'
            print "My name is %s" %self.name
            print "My age is %s" %self.__age
    
        def __secret(self):
            print "I can tell you a secret!"
    
        def tell(self):
            self.__secret()
    
        def test():                 # 注意没带参数self
            print "This is a static func"
    
        cm = classmethod(think)     # 类方法
    
        sm = staticmethod(test)     # 静态方法
    
    me = MyClass()
    print '*'*20
    me.tell()
    print '#'*20
    MyClass.sm()
    
    [root@KARL ~]# python u3.py
    ********************
    I can tell you a secret!
    ####################
    This is a static func
    

    以下两种代码效果相同

    # 1) 通过类名调用类方法和静态方法
    #!/usr/bin/python
    #coding:utf8
    
    class MyClass(object):
        name = 'Karl'
        id = 007
        __age = 18
    
        def think(self):
            self.__age = 28
            name = 'John'
            print "My name is %s" %self.name
            print "My age is %s" %self.__age
    
        def __secret(self):
            print "I can tell you a secret!"
    
        def tell(self):
            self.__secret()
    
        def test():                 # 注意没带参数self
            print "This is a static func"
    
        def test2(self):
            print "This is a class func"
    
        cm = classmethod(test2)     # 类方法
    
        sm = staticmethod(test)     # 静态方法
    
    me = MyClass()
    print '*'*20
    MyClass.cm()
    print '#'*20
    MyClass.sm()
    
    # 1) 结果显示:
    [root@KARL ~]# python u3.py
    ********************
    This is a class func
    ####################
    This is a static func
    
    # 2) 通过装饰器实现相同效果
    #!/usr/bin/python
    #coding:utf8
    
    class MyClass(object):
        name = 'Karl'
        id = 007
        __age = 18
    
        def think(self):
            self.__age = 28
            name = 'John'
            print "My name is %s" %self.name
            print "My age is %s" %self.__age
    
        def __secret(self):
            print "I can tell you a secret!"
    
        def tell(self):
            self.__secret()
    
        @staticmethod
        def test():                 # 注意没带参数self
            print "This is a static func"
    
        @classmethod
        def test2(self):
            print "This is a class func"
    
    #    cm = classmethod(test2)    # 类方法
    
    #    sm = staticmethod(test)    # 静态方法
    
    me = MyClass()
    print '*'*20
    MyClass.test2()
    print '#'*20
    MyClass.test()
    
    # 2) 结果显示:
    [root@KARL ~]# python u3.py
    ********************
    This is a class func
    ####################
    This is a static func
    

    相关文章

      网友评论

          本文标题:2018-12-04

          本文链接:https://www.haomeiwen.com/subject/pazvcqtx.html