support v7兼容包有啥用(一 、啥是支持库)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了support v7兼容包有啥用(一 、啥是支持库)相关的知识,希望对你有一定的参考价值。

参考技术A

support v7兼容包有什么用呢?首先这个兼容包是个支持库。所以我们从支持库开始理解。
概览
由于android系统有很多版本,对于不同的版本,同一个功能,会出现不同。而我们要做的就是让其能够在不同版本的 Android 系统之间顺畅切换。
为了解决这一问题,Android SDK 添加了多个库,这些库统称为“Android 支持库” 。如果应用开发者想要在应用中集成库功能,他们可以添加其中任意一个库。
支持库提供一系列不同的功能:
1、向后兼容版本的框架组件。
2、用于实现建议的 Android布局模式的 UI 元素。
3、支持不同的设备类型。
4、实用程序功能。

向后兼容性

支持库可以让在旧版本 Android 平台上运行的应用支持为新版本平台推出的功能。例如,应用在依赖于框架类的 5.0(API 级别 21)版本以下的 Android 系统上运行时,将无法显示 Material Design 元素,因为该版本的 Android 框架不支持 Material Design。但是,如果此应用添加了支持库的appcompat 库,则可以访问 API 级别 21 中具有的许多功能,其中包括对 Material Design 的支持。因此,您的应用可以在多个平台版本中提供更为一致的体验。

某些情况下,类的支持库版本很大程度上取决于框架提供的功能。因此,如果应用调用其中一个支持类的方法,则支持库的行为将取决于运行应用的 Android 版本。如果框架提供必要的功能,则支持库将通过调用框架执行任务。如果应用在旧版本的 Android 上运行,且框架未显示所需的功能,则支持库自身可能会尝试提供功能或什么都不做。无论是哪一种情形,应用通常都不需要检查其在哪一版本的 Android 上运行,而是通过支持库执行检查并选择适当的行为。通常情况下,名称以 …Compat(如ActivityCompat)结束的类即是如此。

而另外一些情况下,支持库类提供一个不依赖于任何框架 API 可用性的完整、独立版框架类。这些方法可以在支持的所有平台中提供一致的行为。
无论是哪一种情形,应用均无需在运行期间检查系统版本。应用可通过支持库类执行适当的系统检查,并在必要时修改其行为。

支持一般布局模式
支持库提供 Android 框架中未提供的用户界面元素。例如,Android 支持库提供其他布局类,如DrawerLayout。
这些类遵循建议的 Android 设计做法;例如,设计库以一种适合多个 Android 版本的方式遵循 Material Design 的原则。

支持不同的设备类型
Android SDK 为 TV 和穿戴式设备等多种不同的设备类型提供库。应用可以通过相应的支持库为各种平台版本提供功能,且可以在外部屏幕、扬声器和其他目标设备上提供内容。

一般实用程序
Android 支持库提供向后兼容的实用程序功能。
应用可以使用这些实用程序功能为各种 Android 系统版本提供相应的用户体验。例如,支持库的权限处理方式取决于运行应用的平台版本。如果平台支持运行时权限模式,这些方法会向用户请求相应的权限;在不支持运行时权限模式的平台版本中,这些方法将在安装时检查是否已获得相应的权限。

Python,枚举类型有啥用? [复制]

【中文标题】Python,枚举类型有啥用? [复制]【英文标题】:Python, what's the Enum type good for? [duplicate]Python,枚举类型有什么用? [复制] 【发布时间】:2016-10-02 18:26:32 【问题描述】:

在 Python 3.4 中,我们在标准库中获得了一个 Enum 库:enum。我们可以在 pypi 中为enum 获得一个支持 Python 2.4 到 2.7(甚至是 3.1 到 3.3)、enum34 的反向移植。

但我们已经设法在没有这个新模块的情况下相处了相当长的一段时间 - 那么为什么我们现在拥有它呢?

我对其他语言的枚举的用途有一个大致的了解。在 Python 中,通常使用如下的裸类并将其称为枚举:

class Colors:
    blue = 1
    green = 2
    red = 3

这可以在 API 中用于创建值的规范表示,例如:

function_of_color(Colors.green)

如果这有任何批评,它是可变的,你不能(轻松地)迭代它,我们如何知道整数的语义,2

那么我想我可以只使用像命名元组这样的东西,它是不可变的?

>>> Colors = namedtuple('Colors', 'blue green red')
>>> colors = Colors('blue', 'green', 'red')
>>> colors
Colors(blue='blue', green='green', red='red')
>>> list(colors)
['blue', 'green', 'red']
>>> len(colors)
3
>>> colors.blue
'blue'
>>> colors.index(colors.blue)
0

namedtuple 的创建有点多余(我们必须将每个名称写两次),因此有些不雅。获取颜色的“数字”也有点不雅(我们必须写两次colors)。值检查必须用字符串来完成,效率会低一些。

回到枚举。

枚举的目的是什么?他们为语言创造了什么价值?我应该什么时候使用它们,什么时候应该避免它们?

【问题讨论】:

嗯,那么什么时候使用namedtuple 更好呢?我有一个案例,我需要一个常量,比如说,字符串表示的集合RANKING_CRITERIA = ['count', 'pair_count', 'freq'],我不想通过数字 ID 来引用它,因为它在代码中是不可理解的,但是字典不是一个选项,因为它是可变的并且不保证.keys() 的顺序。似乎namedtuple 是我的情况。还有其他想法吗? @alisa 何时使用命名元组?当您需要不可变记录并且不太需要继承时使用它们。但是,现在默认情况下对字典进行排序,因此 .keys() 将通过插入进行排序。更多的上下文将帮助我帮助你。你到底想做什么,为什么要这样做?字符串列表可能是最恰当的。 【参考方案1】:

枚举的目的是什么?他们为语言创造了什么价值?我应该什么时候使用它们,什么时候应该避免它们?

Enum 类型通过 PEP 435 进入 Python。给出的理由是:

枚举的属性对于定义一组不可变的、相关的常量值很有用,这些常量值可能有也可能没有语义。

当为此目的使用数字和字符串时,它们可以被描述为"magic numbers" 或“魔术字符串”。数字很​​少带有语义,字符串很容易混淆(大写?拼写?蛇形还是驼峰形?)

星期几和学校字母成绩就是这种价值观集合的例子。

这是来自docs 的示例:

from enum import Enum

class Color(Enum):
    red = 1
    green = 2
    blue = 3

与裸类一样,它比 namedtuple 示例更具可读性和优雅性,它也是不可变的,并且它还有更多的好处,我们将在下面看到。

严格占优:枚举成员的类型是枚举

>>> type(Color.red)
<enum 'Color'>
>>> isinstance(Color.green, Color)
True

这允许您在 Enum 定义中定义成员的功能。在值上定义功能可以使用其他先前的方法来完成,但这会非常不雅。

改进:字符串强制

字符串表示是人类可读的,而 repr 有更多信息:

>>> print(Color.red)
Color.red
>>> print(repr(Color.red))
<Color.red: 1>

我发现这是对幻数的改进,甚至可能比命名元组中的字符串更好。

迭代(奇偶校验):

枚举也支持迭代(像 namedtuple,但不是裸类):

>>> for color in Color:
        print(color)
Color.red
Color.green
Color.blue

__members__ 属性是枚举名称到它们各自枚举对象的有序映射(类似于 namedtuple 的 _asdict() 函数)。

>>> Color.__members__
mappingproxy(OrderedDict([('red', <Color.red: 1>), ('green', <Color.green: 2>), 
('blue', <Color.blue: 3>)]))

pickle(奇偶校验)支持

您可以对枚举进行序列化和反序列化(以防有人担心):

>>> import pickle
>>> color.red is pickle.loads(pickle.dumps(color.red))
True

改进:别名

这是裸类所没有的一个很好的特性,而且在namedtuple 中很难分辨出别名。

class Color(Enum):
    red = 1
    green = 2
    blue = 3
    really_blue = 3

别名在规范名称之后,但它们都是相同的:

>>> Color.blue is Color.really_blue
True

如果应禁止使用别名以避免值冲突,请使用 enum.unique 装饰器(严格占主导地位的功能)。

严格占优:与is 的比较

该枚举旨在使用is 进行测试,这是对进程中单个对象身份的快速检查。

>>> Color.red is Color.red
True
>>> Color.red is Color.blue
False
>>> Color.red is not Color.blue
True

相等性测试也可以,但is 的身份测试是最佳的。

与其他 Python 类不同的语义

枚举类与常规 Python 类型具有不同的语义。 Enum 的值是 Enum 的实例,并且是这些值在内存中的单例 - 实例化它们没有其他目的。

>>> Color.red is Color(1)

记住这一点很重要,也许这是一个缺点,但在这个维度上比较是比较苹果和橙子。

枚举不假定是有序的

虽然 Enum 类知道创建成员的顺序,但不假定枚举是有序的。这是一个特性,因为许多可枚举的事物没有自然顺序,因此顺序是任意的。

但是,您可以给枚举排序(请参阅下一节)。

子类化

您不能对声明了成员的 Enum 进行子类化,但您可以对未声明成员的 Enum 进行子类化以共享行为(请参阅 docs 中的 OrderedEnum 配方)。 p>

这是一个特性 - 使用成员对 Enum 进行子类化几乎没有意义,但同样,比较是苹果和橘子。

什么时候应该使用enum.Enum

这是 Python 中新的规范枚举。协作者希望您的枚举表现得像这些枚举。

在您希望明确指定使用规范名称而不是任意数据的代码中有规范的枚举数据源的任何地方使用它。

例如,如果您希望用户在您的代码中声明它不是"Green""green"、2 或"Greene",而是Color.green - 使用 enum.Enum 对象。它既明确又具体。

documentation中有很多例子和食谱。

什么时候应该避开它们?

停止自己滚动或让人们猜测幻数和字符串。不要避开它们。拥抱他们。

但是,如果您的枚举成员因历史原因需要为整数,则来自同一模块的 IntEnum 具有相同的行为,但也是一个整数,因为它在子类化 @ 之前继承了内置 int 987654352@。来自IntEnum的帮助:

class IntEnum(builtins.int, Enum)

我们可以看到 IntEnum 值将作为 int 的实例进行测试。

【讨论】:

非常感谢这个全面的答案。在我看来,现在可以用文字类型python.org/dev/peps/pep-0586 替换(完全?)枚举 - 对此有何想法? 我看不到枚举是如何被文字类型替换的。你能帮我把这些点联系起来吗? 我想我可能会收回该声明中更全面(即“完全”)的部分 :) 但作为这种替换的一个例子,我们使用了很多 class SomeCollection(str, Enum) 类,直到我们找到文字。替换了这些之后,我们 a) 认为它更易于阅读(字符串现在看起来像字符串,而不是类的属性),并且 b) 我们可以组合它们,例如LargerCollection = Literal[SmallCollection1, SmallCollection2],我们不能用 Enums 做到这一点(这对我们来说是最相关的原因)。非常感谢这是一个特殊情况,但并不普遍。 取自您的回答; “定义一组不可变的、相关的常量值,这些常量值可能具有也可能不具有语义含义”,来自您的回答。也许有人会说 Literals 是“定义一组不可变的、相关的 allowed 常量值,这些常量值可能有也可能没有语义含义”?因此,它们明显不同,但相关 - 似乎合理且完全有用? :) 找不到专门针对 python 的“Enum vs Literal Type”的好讨论,但这篇文章是针对 TypeScript 的,有些人可能仍然觉得有用:***.com/questions/49761972/…

以上是关于support v7兼容包有啥用(一 、啥是支持库)的主要内容,如果未能解决你的问题,请参考以下文章

javax.persistence,这个包有啥用

究竟啥是画布路径,ctx.closePath() 有啥用?

protobuf-java-2.5.0.jar这个包有啥用

各位,工程下libs文件夹与Android Private Libraries有啥区别

在JAVA中啥是递归?有啥用?

fiddler 手机抓包有啥用