面对对象之@classmethod、@staticmethod用法

@classmethod用法(修饰的函数,第一个参数cls默认是类名,调用方法:实例对象或类对象.方法)

class C_mthod(object):
    name = "f**k"
    def __init__(self,name):
        self.name = name
    @classmethod
    def t_mthod(cls):
        print("hello world",cls.name)

d = C_mthod("F**K")
C_mthod.t_mthod()

————————————————————
hello world f**k

@classmethod调用类静态方法,无法调用类继承方法

分享一个爬虫方法,仅供参考

  1 #!/usr/bin/env python
  2 # -*- coding: utf-8 -*-
  3
  4 import random
  5
  6 import requests
  7 from lxml import etree
  8
  9
 10 class WanfangSpider(object):
 11     @classmethod
 12     def crawl_with_keyword(cls, keyword):
 13         url = ‘http://s.wanfangdata.com.cn/Paper.aspx?q=‘ + keyword
 14         print url
 15         response = requests.get(url, cls.get_headers())
 16         if response.status_code == 200:
 17             return cls.get_info(response.text)
 18         else:
 19             return None
 20
 21     @classmethod
 22     def get_headers(cls):
 23         user_agent = [
 24             ‘Mozilla / 5.0(compatible;MSIE9.0;Windows NT 6.1;Trident / 5.0‘,
 25             ‘Mozilla / 4.0(compatible;MSIE6.0;Windows NT 5.1‘,
 26             ‘Mozilla / 5.0(compatible;MSIE7.0;Windows NT 5.1‘,
 27             ‘Mozilla / 5.0(compatible;MSIE8.0;Windows NT 6.0‘,
 28             ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36‘
 29         ]
 30         headers = {
 31             ‘User-Agent‘: random.choice(user_agent)
 32         }
 33         return headers
 34
 35     @classmethod
 36     def get_info(cls, content):
 37         tree = etree.HTML(content)
 38         divs = tree.xpath(‘//*[@class="left-record"]‘)
 39         result = []
 40         for div in divs:
 41             a_dict = {}
 42             url = div.xpath(‘div/a[@class="title"]/@href‘)
 43             title = div.xpath(‘div/a[@class="title"]‘)[0].xpath(‘string(.)‘)
 44             subtitle = div.xpath(‘div[@class="record-subtitle"]‘)[0].xpath(‘string(.)‘)
 45             # print url, title, subtitle
 46             if not title:
 47                 title = None
 48
 49             if url:
 50                 url = url[0]
 51             else:
 52                 url = None
 53
 54             if subtitle:
 55                 subtitle = subtitle.strip()
 56             else:
 57                 subtitle = None
 58             a_dict[‘url‘] = url
 59             a_dict[‘title‘] = title
 60             a_dict[‘subtitle‘] = subtitle
 61             result.append(a_dict)
 62         return result
 63
 64
 65 class It199Spider(object):
 66     @classmethod
 67     def crawl_with_keyword(cls, keyword):
 68         url = ‘http://www.199it.com/archives/tag/‘ + keyword
 69         print url
 70         response = requests.get(url, cls.get_headers())
 71         if response.status_code == 200:
 72             return cls.get_info(response.text)
 73         else:
 74             return None
 75
 76     @classmethod
 77     def get_headers(cls):
 78         user_agent = [
 79             ‘Mozilla / 5.0(compatible;MSIE9.0;Windows NT 6.1;Trident / 5.0‘,
 80             ‘Mozilla / 4.0(compatible;MSIE6.0;Windows NT 5.1‘,
 81             ‘Mozilla / 5.0(compatible;MSIE7.0;Windows NT 5.1‘,
 82             ‘Mozilla / 5.0(compatible;MSIE8.0;Windows NT 6.0‘,
 83             ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36‘
 84         ]
 85         headers = {
 86             ‘User-Agent‘: random.choice(user_agent)
 87         }
 88         return headers
 89
 90     @classmethod
 91     def get_info(cls, content):
 92         tree = etree.HTML(content)
 93         articles = tree.xpath(‘//article‘)
 94         result = []
 95         for article in articles:
 96             a_dict = {}
 97
 98             # 提取正文
 99             img_url = article.xpath(‘div[@class="entry-list-left"]/div/a/img/@src‘)
100             title = article.xpath(‘div[@class="entry-list-right"]/h2/a/text()‘)
101             url = article.xpath(‘div[@class="entry-list-right"]/h2/a/@href‘)
102             post_time = article.xpath(‘div[@class="entry-list-right"]/table/tr/td[2]/text()‘)
103             tag = article.xpath(‘div[@class="entry-list-right"]/table/tr/td[4]/a/text()‘)
104             summary = article.xpath(‘div[@class="entry-list-right"]/p[@class="post-excerpt"]/text()‘)
105             print img_url, url, title, post_time, tag, summary
106
107             # 构造字典
108             a_dict[‘img_url‘] = img_url[0] if img_url else None
109             a_dict[‘title‘] = title[0] if title else None
110             a_dict[‘url‘] = url[0] if url else None
111             a_dict[‘post_time‘] = post_time[0] if post_time else None
112             a_dict[‘tag‘] = tag[0] if tag else None
113             a_dict[‘summary‘] = summary[0] if summary else None
114             result.append(a_dict)
115         return result if len(result) < 10 else result[0: 10]

classmethod类方法使用

@staticmethod(不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。调用方法:实例对象或类对象.方法 )

class A(object):
    bar = 1
    def foo(self):
        print(‘foo‘)

    @staticmethod
    def static_foo():
        print(‘static_foo‘)
        print(A.bar)

    @classmethod
    def class_foo(cls):
        print(‘class_foo‘)
        print(cls.bar)
        cls().foo()

A.static_foo()
A.class_foo()

——————————————————————
static_foo
1
class_foo
1
foo
时间: 2024-08-06 04:33:53

面对对象之@classmethod、@staticmethod用法的相关文章

property classmethod staticmethod的用法

一:property的用法 1,@property 能够将一个方法伪装成一个属性,它并不会让你的代码有什么逻辑上的提高,只是从调用者的角度上换了一种方式,使之看起来更合理.调用方法从原来的的对象名.方法名(),变成了对象名.方法名. class Person: def __init__(self,name,weight,height): self.name = name self.__height = height self.__weight = weight @property def bmi

35.python全栈之路:面对对象进阶

面对对象进阶 1.多继承中的self class A: def bar(self): print('BAR') self.f1() ''' self本身代表的D类的对象d1 d1如果要在他的父类中去寻找f1 首先应该去C类 ''' class B(A): def f1(self): print('B') class C: def f1(self): print('C') class D(C, B): pass d1 = D() d1.bar() 流程分析: d1 = D(),最终找到了objec

16、python面对对象之类和继承

前言:本文主要介绍python面对对象中的类和继承,包括类方法.静态方法.只读属性.继承等. 一.类方法 1.类方法定义 使用装饰器@classmethod装饰,且第一个参数必须是当前类对象,该参数名一般约定为“cls",通过它来传递类的属性和方法 (不能传递实例属性和实例方法),跟实例方法的self用法相似. 2.类方法的调用 实例对象和类对象都可以调用 3.应用场景 在需要站在类的角度执行某个行为时,那么就可以定义为类方法 class Student: def __init__(self,

6月6日 面对对象复习

面对对象编程核心是对象二字,是一种上帝式的思维,它的优点是解决了程序的扩展性问题. 类有两种属性:数据属性和函数属性 三大特性:继承,封装,多态 多态:python崇尚鸭子类型 封装:将属性隐藏起来,对内开放,对外隐藏: 会变成__X会变成_A__X #A是类名 @property 把函数伪装成一个属性,本质还是一个函数,一定要有返回值 类中定义的函数分为 绑定方法和非绑定方法: 绑定方法默认是给对象使用的,用classmethod装饰器装饰灯的方法是调用给类使用的 非绑定方法是用staticm

python接口自动化九--面对对象编程二,搭建测试环境,多线程与多进程

1.面对对象编程 1.1 基本概念 实例方法:在类里面定义的函数都是实例方法,函数内有self变量 类方法: 不可以实例化,直接用类名调用 类方法可以使用类变量,cls.xxx 实例可以通过self.xx使用类方法 类方法里面不能使用实例方法和实例变量 静态方法: 定义在类里的普通函数 用不了实例方法,实例变量,类方法,类变量 不需要实例化,直接用类名调用 ? 属性方法: 是实例方法 不能有入参 用它的时候,直接m.func,把它当做变量来使用,后面不需要加括号 它是获取函数的返回值 析构函数:

面对对象进阶2

面对对象进阶2 类的封装 封装:隐藏属性或方法,外部无法使用,内部可以使用,再类定义阶段就执行了,真的想引用,就使__类名__属性名 隐藏模块内部的函数/变量_x:from module import *(无法导入),from module import _x(不合理) @property:被 @property 装饰的函数会从函数变成属性,也就是说直接.函数名,不需要加括号使用 class People: def __init__(self,pwd): self.__pwd = pwd @pr

面对对象的属性和方法

1,类的私用属性和私用方法 类中私用属性和私用方法的使的使用是加双划线 class A: __N = 0 # 类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N def __init__(self): self.__X = 10 # 变形为self._A__X def __foo(self): # 变形为_A__foo print('from A') def bar(self): self.__foo() # 只有在类内部才可以通过__foo的形式

js面对对象编程(二):属性和闭包

上篇博客中讲解了一些js对象的基本概念和用法,这篇博客讲解一下js属性方面的:公有属性,私有属性,特权方法. 如果学过java,公有属性,私有属性,特权方法(即可以访问和设置私有属性的方法)一定很熟悉,那么让我们来看看在js里如何实现呢? 1.公有属性 首先看公有的第一层意思是可以被大家所访问的,对外开放的属性,是相对于私有属性而言的: function Person(name,age){ this.name=name; this.age=age; this.getName=function()

面对对象总结

1. 基础概念:1.面向过程:认识事物和分析解决问题的方式,强调解决问题的流程化                          功能行为,缺点就是不能很好地适应需要的变化c/c++                        2.面向对象:认识事物的方式方法,全面认知事物(属性,方法),将有联系的功能打包放入一个对象里,基于面对过程                       3.面向接口编程:抽象对象身上的属性,方法.通过接口的实现类创建接口对象(contactdao cd=new co