Life is short, you need Python.
完整教程:廖雪峰的官方网站
在学习廖雪峰老师的Python教程,记一下笔记。
1、获取对象信息
- 使用 isinstance() 判断class的类型
>>> isinstance("ABC",str) #判断"ABC"是否是字符串型
True
注:与 type() 的不同, isinstance()判断类型,可以将指定类型及其子类“一网打尽”。
还可以判断一个变量是否是某些类型中的一种:
>>> isinstance([1,2,3],(list,tuple)) #[1,2,3]是否是list或者tuple中的一种
True
>>> isinstance((1,2,3),(list,tuple))
True
>>>
2、获得一个对象的所有属性和方法
- 使用dir(), 返回一个包含字符串的list
>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
通过前面的学习可知,类似__xxx__的属性和方法在Python中都是有特殊用途的。
如__len__方法返回长度。在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__()方法。
以下方法是等效的:
>>> len("ABC")
3
>>> "ABC".__len__()
3
3、实例属性和类属性
- 类属性 :直接在class中定义的属性是类属性)
class Student():
nums="2019001" #直接在class中定义的属性是类属性,归Student类所有
def __init__(self, name):
self.name=name
print(Student.nums) #可以直接通过类名调用,所有实例都可以访问
a=Student("XiaoMing")
a.nums="2018001" #由于实例属性优先级比类属性高,因此,它会屏蔽掉类的nums属性
print(a.nums)
print(Student.nums)
-----------------------------------------------面向对象高级篇--------------------------------------------------------
4、使用__slots__
正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。
>>> class Student(): #定义Student类
pass
>>> s=Student() #创建对象
>>> s.name="XiaoMing" #为对象绑定name属性
>>> s.name
'XiaoMing'
如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性。
为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性
>>> class Student(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
>>> s=Student()
>>> s.nums="2019001" #尝试绑定非name, age属性时会报错
注:__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的,除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__。
5、使用@property
在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把参数范围任意更改,应当限制参数范围。
class Student():
pass
a=Student()
a.score=999 #未对参数做限制,导致可以传入任意值
print(a.score)
如果要限制成绩为[0,100],可以定义setScore()和getScore()函数:
class Student():
def setScore(self, score):
if score>=0 and score<=100:
self.score=score
else:
print("ERROR")
def getScore(self):
return self.score
a=Student()
a.setScore(100)
为了可以像直接用属性那样方便并且可以检查参数,Python提供了@property装饰器负责把一个方法变成属性调用。
class Student():
@property
def score(self): #getScore()方法
return self._score
@score.setter
def score(self, value):
if value>=0 and value<=100:
self._score=value
else:
print("ERROR")
a=Student()
a.score=100
print(a.score)
把一个 get()方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个 set()方法变成属性赋值
还可以定义只读属性,只定义 get 方法,不定义 set 方法就是一个只读属性
关于@property还请参考廖雪峰老师的详细教程或者网上查找相关知识。
6、多重继承
与Java的单一继承不同,Python支持多重继承,一个子类就可以同时获得多个父类的所有功能。
举个例子:
class Animal():
def run(self):
print("running...")
class People():
def speak(self):
print("speaking...")
class OneMan(People, Animal): #同时继承了Animal类和People的所有方法
pass
a=OneMan()
a.run()
a.speak()
运行结果:
running...
speaking...
7、定制类
看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。
__slots__我们已经知道怎么用了,len()方法我们也知道是为了能让class作用于len()函数。
除此之外,Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类。
文章篇幅原因,具体请查看官方文档或者廖雪峰老师的教程:
链接:定制类
8、使用枚举类
import导入系统内置模块enum
from enum import Enum
class Month(Enum): #继承Enum类
Jan=1
Feb=2
Mar=3
Apr=4
May=5
Jun=6
Jul=7
Aug=8
Sep=9
Oct=10
Nov=11
Dec=12
D=12 #允许值相同,此时D类似于Dec的别名
print(Month.Dec.value) #12
print(Month.D.value) #12
加入@unique装饰器可以帮助我们检查保证没有重复值。
9、使用元类
暂未更新。。。
原文链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017592449371072
本文只是针对个人的一个知识点总结,详细完整的知识点请参考廖雪峰老师的网站教程。
点击前往:廖雪峰的官方网站