Python3面向对象编程

获取对象信息

使用isinstance()

如果继承关系是:

object -> Animal -> Dog -> Husky

那么,isinstance()就可以告诉我们,一个对象是否是某种类型。先创建3种类型的对象:

a = Animal()
d = Dog()
h = Husky()

然后,判断:

isinstance(h, Husky)  # True

没有问题,因为h变量指向的就是Husky对象。
再判断:

isinstance(h, Dog)  # True

h虽然自身是Husky类型,但由于Husky是从Dog继承下来的,所以,h也还是Dog类型。换句话说,isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上。

因此,我们可以确信,h还是Animal类型:

isinstance(h, Animal)  # True

使用dir()

如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法:

dir('ABC')
>>['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

仅仅把属性和方法列出来是不够的,配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:

class MyObject(object):
    def __init__(self):
        self.x = 9

    def power(self):
        return self.x * self.x

obj = MyObject()

紧接着,可以测试该对象的属性:

print(hasattr(obj, 'x')) # 有属性'x'吗?
>>True
print(hasattr(obj, 'y')) # 有属性'y'吗?
>>False
setattr(obj, 'y', 19) # 设置一个属性'y'
print(getattr(obj, 'y')) # 获取属性'y'
>>19

实例属性和类属性

由于Python是动态语言,根据类创建的实例可以任意绑定属性。给实例绑定属性的方法是通过实例变量,或者通过self变量:

class Student(object):
    def __init__(self, name):
        self.name = name

s = Student('Bob')
s.score = 90
print(s.__dict__)
Python3面向对象编程_第1张图片
image.png

但是,如果Student类本身需要绑定一个属性呢?可以直接在class中定义属性,这种属性是类属性,归Student类所有:

class Student(object):
    name = 'Student'

当我们定义了一个类属性后,这个属性虽然归类所有,但类的所有实例都可以访问到。

枚举类

Python提供了Enum类来实现枚举。

enum模块是系统内置模块,可以直接使用import导入,但是在导入的时候,不建议使用import enum将enum模块中的所有数据都导入,一般使用的最多的就是enum模块中的Enum、IntEnum、unique这几项

# 导入枚举类
from enum import Enum
 
# 继承枚举类
class color(Enum):
    YELLOW = 1
    BEOWN = 1 
    # 注意BROWN的值和YELLOW的值相同,这是允许的,此时的BROWN相当于YELLOW的别名
    RED = 2
    GREEN = 3
    PINK = 4
 
class color2(Enum):
    YELLOW = 1
    RED = 2
    GREEN = 3
    PINK = 4
print(color.YELLOW) # color.YELLOW
print(type(color.YELLOW)) # 
print(color.YELLOW.value)  # 1
print(type(color.YELLOW.value)) # 
print(color.YELLOW == 1)    # False
print(color.YELLOW.value == 1)  # True
print(color.YELLOW == color.YELLOW)  # True
print(color.YELLOW == color2.YELLOW)  # False
print(color.YELLOW is color2.YELLOW)  # False
print(color.YELLOW is color.YELLOW)  # True
print(color(1))         # color.YELLOW
print(type(color(1)))   # 

注意事项如下:
1、枚举类不能用来实例化对象
2、访问枚举类中的某一项,直接使用类名访问加上要访问的项即可,比如 color.YELLOW
3、枚举类里面定义的Key = Value,在类外部不能修改Value值,也就是说下面这个做法是错误的

color.YELLOW = 2  # Wrong, can't reassign member

4、枚举项可以用来比较,使用==,或者is
5、导入Enum之后,一个枚举类中的Key和Value,Key不能相同,Value可以相,但是Value相同的各项Key都会当做别名,
6、如果要枚举类中的Value只能是整型数字,那么,可以导入IntEnum,然后继承IntEnum即可,注意,此时,如果value为字符串的数字,也不会报错:

from enum import IntEnum

7、如果要枚举类中的key也不能相同,那么在导入Enum的同时,需要导入unique函数,并使用@unique装饰函数

from enum import Enum, unique

你可能感兴趣的:(Python3面向对象编程)