zoukankan      html  css  js  c++  java
  • Python3入门(九)——面向对象OOP高级编程

    一、使用__slots__限制属性绑定

      动态绑定实例的方法:

    class Person(object):
    
        def run(self):
            print("奔跑吧!")
    
    
    p1 = Person()
    p1.name = "江北"

      但是这样,"new出来"的实例就可以为所欲为的绑定任意属性了。

      Python中提供了__solts__来限制属性绑定,这样就只能动态绑定指定的属性了!

    class Person(object):
        __slots__ = ("name", "age")
    
        def run(self):
            print("奔跑吧!")
    
    
    p1 = Person()
    p1.name = "江北"

      // 更多详细限制,不在此处赘述

    二、使用@property

      上一章已经讲到,定义的属性可以通过get set来限制,但是似乎不像Java的IDEA一样,可以直接快捷生成对应get set,Python的手写set get显然不符合Python简洁的特性,为此,Python引入了@property(通过前面知道是一个装饰器)来完成这个功能。

      不使用装饰器之前:

    class Person(object):
    
        def get_age(self):
            return self._age
    
        def set_age(self, age):
            if age > 0:
                self._age = age
    
    
    p1 = Person()
    p1.set_age(18)
    print(p1.get_age())

      使用之后:

    class Person(object):
        @property
        def age(self):
            return self._age
    
        @age.setter
        def age(self, value):
            if age > 0:
                self._age = value
    
    # 实际使用p1.age = xx时转为使用set,实际使用p1.age时转为get
    p1 = Person()
    p1.age = 19
    print(p1.age)

      完整示例,参考:https://blog.csdn.net/u013205877/article/details/77804137

    三、多重继承

        直接看写法:

    class Dog(Mammal, Runnable):
        pass

        通常,这种多重继承我们称之为 MixIn(mixin) 

    四、定制类

      形如之前限制绑定的__slots__就是存在特殊用途的,也就是之前介绍的__xx__形式的在Python中是特殊变量。以下介绍几个常用的:

      1.__str__

        在这个方法中返回合适的字符串,就完成了python的toString()了:

    class Person(object):
        def __init__(self, name):
            self.__name = name
    
        def __str__(self):
            return "这是toString(),name是:" + self.__name
    
    
    print(Person("江北"))

        这样直接打name出来的也是不美化的,解决方式是再定义一个方法,偷懒的写法如下;

    __repr__ = __str__

      2.__iter__

        要像list那种用于for .. in xx中,需要实现__iter__并返回迭代对象

      3.__getattr__

        用于获取属性,例如类中不存在这个属性时,则Python会尝试去调用__getattr__去获取(存在时正常调用):

    class Person(object):
        def __init__(self, name):
            self.__name = name
    
        def __str__(self):
            return "这是toString(),name是:" + self.__name
    
        def __getattr__(self, item):
            if item == "age":
                return 18
    
    
    print(Person("江北").age)

        // 实际应用参考廖老师博客

      4.__call__

        用来调用类似以下的情况:

    p = Person("江北")
    p()

        这种直接调用实例()方法,类似scala中的apply(),Python中使用如下:

    class Person(object):
        def __init__(self, name):
            self.__name = name
    
        def __call__(self, *args, **kwargs):
            print("call被调用,携带参数为:" + args[0])
    
    
    p = Person("江北")
    p("abc")

        // __call__可以携带参数,也可以不携带参数

    五、枚举类

      直接看两种定义方法

    from enum import Enum
    
    Month = Enum("Month", ("JAN", "FEB")) # value默认从1开始计数
    
    
    class M(Enum):
        JAN = 0  # 设置value为0
        FEB = 1

      更多,参考:https://www.cnblogs.com/xiexiaoxiao/p/7100950.html

    六、元类

      1.使用type()动态创建类

    Hello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class

    要创建一个class对象,type()函数依次传入3个参数:

    1. class的名称;
    2. 继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
    3. class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。

      2.metaclass元类

        元类就是创建类的类。元类和类的关系,类似于类和实例的关系

        让人头大的这一块就不在入门阶段介绍了(就像动态代理,平时也很少写到)。有增强篇时再做介绍

  • 相关阅读:
    asp iis5.1x 2147467259 (0x80004005)
    asp 编辑 文本框为何会自动多出个逗号?
    asp 调用Recordset对象操作数据库
    windows2003 iis中播放flv格式的视频设置
    金额拆分 "万千百"..
    类似银行交易记录
    太扯了asp
    asp中通过Connection链接数据库
    给被Access过大问题困扰的网站,提供几种解决方案
    六款WEB上传组件性能测试与比较
  • 原文地址:https://www.cnblogs.com/jiangbei/p/8933593.html
Copyright © 2011-2022 走看看