C# 对象作为参数_史上最全 Python 面向对象编程( 二 )


调用类的三种方法 实例方法
# -*- coding: utf-8 -*-# @Time: 2018/5/3 0003 17:16# @Author: Langzi# @Blog: www.langzi.fun# @File: 面向对象3.py# @Software: PyCharmimport sysimport timeimport requestsreload(sys)sys.setdefaultencoding('utf-8')class dd:def __init__(self,url):self.url=urldef runx(self):print requests.get(self.url).status_codea = dd('http://www.langzi.fun')a.runx()# 这种调用方法就是实例方法
静态方法
静态方法由类调用,无默认参数 。将实例方法参数中的self去掉,然后在方法定义上方加上@,就成为静态方法 。它属于类,和实例无关 。建议只使用类名.静态方法的调用方式 。(虽然也可以使用实例名.静态方法的方式调用)
# -*- coding: utf-8 -*-# @Time: 2018/5/3 0003 17:21# @Author: Langzi# @Blog: www.langzi.fun# @File: 面向对象4.py# @Software: PyCharmimport sysimport requestsreload(sys)sys.setdefaultencoding('utf-8')class ff:@staticmethoddef runx():print requests.get('http://www.langzi.fun').status_codeff.runx()#这里就直接调用了类的变量,只在类中运行而不在实例中运行的方法
经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法. 比如更改环境变量或者修改其他类的属性等能用到静态方法. 这种情况可以直接用函数解决, 但这样同样会扩散类内部的代码,造成维护困难 。
类方法
类方法由类调用,采用@装饰,至少传入一个cls(代指类本身,类似self)参数 。执行类方法时,自动将调用该方法的类赋值给cls 。建议只使用类名.类方法的调用方式 。(虽然也可以使用实例名.类方法的方式调用)
实际案例
如果要构造一个类,接受一个网站和这个网站的状态码,然后打印出来 。就像这样:
import sysimport requestsreload(sys)sys.setdefaultencoding('utf-8')class gg:def __init__(self,url,stat):self.url=urlself.stat=statdef outer(self):print self.urlprint self.stata = gg('langzi',200)a.outer()
这样就是使用实例方法,虽然可以实现,但是有的时候传入的参数并不是(‘’,200)这样的格式,而是(‘-200’)这样的,那该怎么做?首先要把这个拆分,但是要使用实例方法实现起来很麻烦,这个时候就可以使用类方法 。
# -*- coding: utf-8 -*-# @Time: 2018/5/3 0003 17:27# @Author: Langzi# @Blog: www.langzi.fun# @File: 面向对象5.py# @Software: PyCharmimport sysimport requestsreload(sys)sys.setdefaultencoding('utf-8')class gg:url = 0stat = 0# 因为使用classmethod后会传入新的变量,所以一开始是需要自己先定义类变量def __init__(self,url=0,stat=0):# 这里按照正常的定义构造函数self.url=urlself.stat=stat@classmethod# 装饰器,立马执行下面的函数def split(cls,info):# 这个函数接受两个参数,默认的cls就是这个类的init函数,info就是外面传入进来的url,stat=map(str,info.split('-'))# 这里转换成了格式化的结构data = http://www.kingceram.com/post/cls(url,stat)# 然后执行这个类第一个方法,这个类构造函数需要传入两个参数,于是就传入了两个参数return data# 这里就直接返回了函数结果def outer(self):print self.urlprint self.statr = gg.split(('langzi-200'))r.outer()# 这里是调用类方法,与调用实例方法一样
类的特性 封装
封装是指将数据与具体操作的实现代码放在某个对象内部,外部无法访问 。必须要先调用类的方法才能启动 。
案例
class cc:ccc = 'ccc'# cc就是类名 如果想要继承别的类 就class cc(threading) 意思就是从threading继承def __init__(self,a,b,c):self.a=aself.b=bself.c=cprint e.ccc#类变量,在类里面找到定义的变量 。print ccc# 这里会报错,这就是封装 。类中的函数同理 。