【廖雪峰Python教程】学习笔记四 (面向对象)

Life is short, you need Python.

完整教程廖雪峰的官方网站

在学习廖雪峰老师的Python教程,记一下笔记。

1、获取对象信息

  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、获得一个对象的所有属性和方法

  1. 使用dir(), 返回一个包含字符串的list
>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

通过前面的学习可知,类似__xxx__的属性和方法在Python中都是有特殊用途的。
如__len__方法返回长度。在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__()方法。
以下方法是等效的:

>>> len("ABC")
3
>>> "ABC".__len__()
3

3、实例属性和类属性

  1. 类属性 :直接在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

本文只是针对个人的一个知识点总结,详细完整的知识点请参考廖雪峰老师的网站教程。

点击前往:廖雪峰的官方网站

发布了17 篇原创文章 · 获赞 24 · 访问量 1924

猜你喜欢

转载自blog.csdn.net/qq_45271256/article/details/103299461