Skip to main content
 Web开发网 » 编程语言 » Python语言

Python的抽象方法实现的简洁方式

2021年11月26日6070百度已收录

  一个小的疑问:

  全局函数的第一个参数可以为self么?

  全局函数可以作为成员函数使用么?

  下面是编程中碰见的一个语法现象,Python的面向对象的底层实现不是那么简单的。

  一、来自scrapy框架的数据项加载器处理器代码

  # -*- coding: utf-8 -*-

  import scrapy

  import scrapy.loader

  from scrapy.loader.processors import Join, MapCompose, TakeFirst

  class TencentItemSpider(scrapy.Spider):

  name = 'tencent_item'

  allowed_domains = ['ke.qq.com']

  start_urls = ['']

  def parse(self, response):

  item = JobscrapyItem()

  # loader = scrapy.loader.ItemLoader(item=item,selector=response.selector)

  # loader = scrapy.loader.ItemLoader(item=item, response=response)

  # 测试xpath的代码

  # price = response.xpath('/html/body//section/div/div/ul/li/div/span[@class="line-cell item-price"]/text()')

  # print('self:', len(price), price.getall())

  # company_name = response.xpath('/html/body//section/div/div/ul/li/div/span/a/text()')

  # print('self:', len(company_name), company_name.getall())

  course_list = response.xpath('/html/body//section[@class="main autoM clearfix"]/div/div/ul/li')

  print(len(course_list))

  for course_ in course_list:

  # loader = scrapy.loader.ItemLoader(item=item, selector=course_)

  loader = CourseItemLoader(item=item, selector=course_)

  loader.add_xpath('company_name', 'div/span/a/text()')

  loader.add_xpath('course_price', 'div/span[@class="line-cell item-price"]/text()')

  re = loader.get_xpath('div/span[@class="line-cell item-price"]/text()')

  # print(re)

  yield loader.load_item()

  def in_price_processor(value):

  print(float(value[0][1:]))

  # print(value)

  # 删除¥符号,转换为float类型

  return float(value[0][1:])

  def out_price_processor(value):

  print(value)

  # 删除¥符号,转换为float类型

  return value[0] + 100

  class JobscrapyItem(scrapy.Item):

  # 培训公司名

  company_name = scrapy.Field()

  # 课程价格

  course_price = scrapy.Field(

  # input_processor=in_price_processor,

  # output_processor = out_price_processor

  # -----------------------重点关注这个全局函数的self参数

  def price_processor(self, value):

  print(self) # 输出的类型是CourseItemLoader

  print(float(value[0][1:]))

  # print(value)

  # 删除¥符号,转换为float类型

  return float(value[0][1:])

  class CourseItemLoader(scrapy.loader.ItemLoader):

  course_price_in = price_processor # 这个函数被调用。

  # course_price_out = price_processor

  二、Python的接口编程实现技巧

  从上面代码可以得到一种类似抽象接口实现的编程技巧;尽管传统使用的是抛出实现异常机制,我觉得这种编程思路也不错(传统异常方式稳定性,逻辑性更加好点),可以实现类的定义与成员实现的分离,达到程序设计的低耦合实现,在此备忘一下代码。

  class A:

  meth = None

  def meth(self, param):

  print(param)

  class B(A):

  meth = meth

  b = B()

  b.meth('hello')

评论列表暂无评论
发表评论
微信