• Jingxiao 置顶
    2019-06-09
    思考题答案:
    John Si 的评论说的很对,如果想要强行访问父类的私有类型,做法是 self._ParentClass__var,这是非常不推荐的 hacky method。以下是示范代码:
    class A:
        __a = 1

    class B(A):
        pass

    b = B()
    print(b._A__a)
    展开
    
     5
  • 益达
    2019-06-05
    看不懂不睡觉
     3
     39
  • Wing·三金
    2019-06-05
    思考题:子类继承父类私有变量的方法
    - 通过定义 get/set 函数来间接操作私有变量
    - 通过 实例名._父类名__私有变量名 来直接调用,所以事实上 python 并不直接私有变量

    # 主要知识点

    - 搜索引擎的四个组成部分
    - 迭代开发的流程
    - 类的继承与父类函数的强行调用
    - 词袋模型 + 逆序索引 + 合并有序数组 = 优化检索速度 + 考虑单词顺序与间隔
    - pylru 的基本用法
    - 多重继承的初始化规则

    # 搜索引擎

    - 搜索器:相当于爬虫
    - 索引器:为每个文件/网页建立唯一的索引
    - 检索器:高效地检索并返回匹配的文件/网页
    - 用户接口:输入框和结果返回界面

    # 迭代开发的流程

    - 构建一个通用的基本框架
    - 从最简单的情况考虑起,搭建一个能运行的极简版本
    - 按照实际需要不断对具体的实现过程进行优化:如在本讲的例子中,先考虑了单个搜索词 + 小搜索量的情况,构建了 ver 1;然后考虑了多个搜索词,构建了词袋的 ver 2;再考虑了大搜索量,构建了词袋 + 逆序索引的 ver 3(提了 搜索词排序与间隔 情况下的处理思路);最后考虑了负载与重复性搜索问题,构建了使用 LRU 缓存策略的 ver 4
    - 如果回过头来看最初的框架,还能发现 add_corpus 的方法并不适用于文件较大的情况,结合前面第六讲的内容可以做些改进;以及 main 函数直接用了 for 循环来找所有的文件,实际使用时用的是诸如 os.walk 的方法
    展开
    
     31
  • 
    2019-06-07
    这篇文章就值回票价了。
    
     22
  • 小侠龙旋风
    2019-06-08
    和面向对象无关的关键词整理:
    1.一个搜索引擎由搜索器、索引器、检索器和用户接口四个部分组成。
    2.Bag of Words Model,词袋模型。
    3.Inverted Index Model,倒序索引。
    4.语料corpus分词,齐夫定律。
    5.合并 K 个有序数组。
    6.LRU缓存。
    难点消化:4,5,6
    思考题:
    Python并没有真正的私有化支持,但可用下划线得到伪私有:
    (1)_xxx "单下划线 " 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量,需通过类提供的接口进行访问;
    (2)__xxx 类中的私有变量/方法名,只有类对象自己能访问,连子类对象也不能访问到这个数据。
    (3)__xxx__ 魔法函数,前后均有一个“双下划线” 代表python里特殊方法专用的标识,如 __init__() 代表类的构造函数。
    展开

    作者回复: 👍

     1
     11
  • John Si
    2019-06-05
    关于思考题,子类不能继承父类私有属性,只可透过self._Parent__varname去读取该私有属性的值,或在父类创建方法返回私有属性的值,然后子类调用父类方法去取得该私有属性的值

    class Animal():
        
        def __init__(self, sex, height, weight):
            self.__sex = sex
            self.height = height
            self.weight = weight
            
        def say_hello(self):
            raise 'say hello not implemented'
            
        def get_sex(self):
            print('Achieve sex information for parent method: {}'.format(self.__sex))
            
    class Person(Animal):
        
        def __init__(self,name,age):
            super().__init__('M',172,70)
            self.name = name
            self.age = age
            
        def say_hello(self):
            print('Hello, {}, age: {}, weight:{}'.format(self.name, self.age, self.weight))
            print('Sex: {}'.format(self._Animal__sex))
            

    john = Person('John',35)
    john.say_hello()
    john.get_sex()

    ========================
    Hello, John, age: 35, weight:70
    Sex: M
    Achieve sex information for parent method: M

    展开
    
     7
  • 我是传奇
    2019-06-05
    图不错
    
     5
  • Danpier
    2019-06-05
    BOWInvertedIndexEngine search函数后半部分少了缩进,第40行开始
     1
     5
  • fly
    2019-06-06
    是search()又被重载了,不是query()
    
     4
  • 闲人
    2019-06-20
    BOWInvertedIndexEngine类的search函数中:
    query_words_index = list()
    for query_word in query_words:
        query_words_index.append(0)
    这一段没看明白:
    query_words_index是一个全为0的列表?
    有什么作用?
    展开
     3
     3
  • tux
    2019-06-05
    运行文中代码,始终在运行状态!

    修改了一处:
    class SearchEngineBase(object):
        ...
        def add_corpus(self, file_path):
            with open('文件的目录' + file_path, 'r') as fin: #修改了此处
                text = fin.read()
                print('text:', text) #能打印出内容
                
                
    不修改代码,报FileNotFoundError。去查资料,应该用全路径。 总有个想先看到反馈结果的 强迫症。
    展开
    
     3
  • chuan_chen
    2019-09-04
    感觉这篇好难。。。
    
     2
  • 海生
    2019-06-05
    可不可以讲解一些开源的框架什么的,python 这边深度学习框架很多。这些框架的代码很优秀,也是语言的核心技术运用最多的地方。
    
     2
  • farFlight
    2019-06-05
    按照我之前的理解,Python是没有严格的private变量的。子类确实无法直接访问父类"self.__var"变量,但是可以通过"self._Superclass__var"访问。要想比较好地访问或者修改这些变量,可以像JAVA一样写getter和setter吧?
    另外我有两个问题:
    1. 一些手册中说python的多重继承非常混乱不可靠,尤其涉及很多重载的时候,因此需要避免,或者采用composition的方式。实际工程中是否会有这样的考虑呢?
    2. 以搜索引擎为例,如何规划各个类以及函数的功能,是否是 设计模式 方面的知识呢?
    
     2
  • 🇨🇳
    2019-08-23
    您好,请问继承object和不继承用法区别是什么呢?概念上还是有点模糊
    
     1
  • WANG
    2019-06-20
    老师,您好,有个疑问,您在讲 BOW Model时,
    class BOWInvertedIndexEngine(SearchEngineBase):
        def __init__(self):
            super(BOWInvertedIndexEngine, self).__init__()
            self.inverted_index = {}


        def search(self, query):
            query_words = list(self.parse_text_to_words(query))
            query_words_index = list()
            for query_word in query_words:
                query_words_index.append(0)


     query_words_index.append(0) 为啥要添加 0, 应该是 query_word 吧?
    展开
     3
     1
  • 风居住的街
    2019-06-17
    Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx
    
     1
  • 程序员人生
    2019-06-05
    今天内容有点多。对于课后留题,在没有写代码测试时候,觉得是不能继承的。
    但是在写了以下代码后,好像私有变量是可以继承的,代码如下,请老师指点
    class A():

        _privateVar = "privateVariable"

        def getPrivateVar(self):
            return self._privateVar

    class B(A):
        def printVar(self):
            print(self._privateVar)
            print(self.getPrivateVar())
            self._privateVar = "modify"
            print(self._privateVar)

    b = B()

    b.printVar()

    运行结果:
    privateVariable
    privateVariable
    modify
    展开
    
     1
  • tux
    2019-06-05
    运行文中代码,始终在运行状态 --> 因为:query = input() 需要输入内容。 这个自己让自己很尴尬呀
    def main(search_engine):
        ...
        while True:
            query = input()
                
    
     1
  • Paul Shan
    2019-11-15
    只看懂了面向对象的内容:
    定义好接口,在实践中不断迭代实现以满足现实的功能。接口的稳定性是给调用者以良好界面。实现的不断迭代是为了满足不断变化的需求。这种设计兼顾了稳定和灵活,是非常好的trade off。但在实践中把握接口的粒度近乎艺术,现实中大量代码不是缺乏良好的抽象,就是过度定义了一堆没用的接口,或者兼而有之。
    
    
我们在线,来聊聊吧