$ 面向对象
对象是类的实例。
方法是类中定义的函数。
@ 类对象
类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用:
def __init__(self):
self.data = []
self代表类的实例,而非类
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
class Test:
def prt(self):
print(self)
print(self.__class__)
t = Test()
t.prt()
执行结果(self 代表的是类的实例,代表当前对象的地址;而 self.class 则指向类):
<__main__.Test object at 0x00000257C2C609C8>
<class '__main__.Test'>
说明:self 不是 python 关键字,换成其它效果相同。
@ 类的方法 -> 使用 def 关键字来定义方法,必须包含参数 self, 且为第一个参数
@ 继承、方法重写
#!/usr/bin/python3
#类定义
class people:
#定义基本属性
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
#定义构造方法
def __init__(self,name,age,weight):
self.name = name
self.age = age
self.__weight = weight
def speak(self):
print("%s说: 我今年%d岁。" %(self.name,self.age))
#单继承示例
class child(people):
food = ''
def __init__(self,name,age,weight,food):
#调用父类的构函
people.__init__(self,name,age,weight)
self.food = food
#覆写父类的方法
def speak(self):
print("%s说: 我%d岁啦,我饿了~有没有%s吃?"%(self.name,self.age,self.food))
#另一个类,多重继承之前的准备
class speaker():
topic = ''
name = ''
def __init__(self,name,topic):
self.name = name
self.topic = topic
def speak(self):
print("我叫%s,我今天要演讲的主题是“%s”。"%(self.name,self.topic))
#多重继承
class sample(speaker,child):
a =''
def __init__(self,name,age,weight,food,topic):
child.__init__(self,name,age,weight,food)
speaker.__init__(self,name,topic)
print('#child类继承自people类')
test1 = child('羡羡',3,130,'莲藕排骨汤')
test1.speak()
print('#sample类继承自child类和speaker类')
test2 = sample('无羡',3,130,'莲藕排骨汤','如何成为莲花坞最皮的崽')
test2.speak() #方法名同,默认调用的是在括号中排前地父类的方法
执行结果:
#child类继承自people类
羡羡说: 我3岁啦,我饿了~有没有莲藕排骨汤吃?
#sample类继承自child类和speaker类
我叫无羡,我今天要演讲的主题是“如何成为莲花坞最皮的崽”。
@ 子类继承父类构造函数说明
1.子类不重写__init__()方法,实例化子类,会自动调用父类的__init__()的方法。
2.子类重写__init__()方法,实例化子类,不会自动调用父类的__init__()的方法。
3.子类重写__init__()方法又要继承父类的构造方法,可以使用 super 关键字:
super(子类,self).__init__(参数1,参数2,....) 注:在类之外,self 可换成实例名如c = Child(),eg:super(Child,c).myMethod()
还有一种经典写法:父类名称.__init__(self,参数1,参数2,...)
@类的私有属性与私有方法
__private_attrs:两个下划线开头,声明该属性为私有,只能在类的内部调用self.__private_attrs ,不能在类的外部调用。
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用self.__private_methods ,不能在类的外部调用。
实例(在类的外部)不能访问私有变量,否则 AttributeError: 'xxx' object has no attribute '__xx'
$ Python3 标准库概览(摘录)
模块时内置的 dir() 和 help() 分别可以看模块下的方法和帮助
@ 操作系统接口
os模块提供了与操作系统相关联的函数
>>> import os
>>> os.getcwd() # 返回当前的工作目录
'C:\\Python34'
>>> os.chdir('/server/accesslogs') # 修改当前的工作目录
>>> os.system('mkdir today') # 执行系统命令 mkdir
0 # 创建成功
>>>
针对日常的文件和目录管理任务,shutil模块提供了一个易于使用的高级接口:
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
>>> shutil.move('/build/executables', 'installdir')
@ 文件通配符
glob模块提供了一个函数用于从目录通配符搜索中生成文件列表:
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']
@ 命令行参数
通用工具脚本经常调用命令行参数。这些命令行参数以链表形式存储于 sys 模块的 argv 变量。
例如在命令行中执行 "python demo.py one two three" 后可以得到以下输出结果:
>>> import sys
>>> print(sys.argv)
['demo.py', 'one', 'two', 'three']
@ 日期和时间,datetime模块
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2019, 10, 26)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'10-26-19. 26 Oct 2019 is a Saturday on the 26 day of October.'
>>>
>>> birthday = date(1949, 10, 1)
>>> age = now - birthday
>>> age.days
25592
>>>
@ 数据压缩
以下模块直接支持通用的数据打包和压缩格式:zlib,gzip,bz2,zipfile,以及 tarfile。
>>> import zlib
>>> s = b'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch which has which witches wrist watch'
>>>
@ 性能度量
有些用户对了解解决同一问题的不同方法之间的性能差异很感兴趣。Python 提供了一个度量工具,为这些问题提供了直接答案。
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791
相对于 timeit 的细粒度,profile和pstats模块提供了针对更大代码块的时间度量工具。
@ 测试模块
doctest模块提供了一个工具,扫描模块并根据程序中内嵌的文档字符串执行测试。
unittest模块可以在一个独立的文件里提供一个更全面的测试集。