tl; dr什么是Pythonic(Py 3)指定大量定义的位掩码和常量的方法?使用枚举或只是将一组consts作为类变量?和优点/缺点?
背景
我正在将C代码移植到Python 3.在C代码中有大量定义用作位掩码:
#define ERR_1 = 0x8
#define ERR_2 = 0x2
#define ERR_4 = 0x100
...
Run Code Online (Sandbox Code Playgroud)
我认为在Python中使用Pythonic的方法是使用a Enum,我遇到了IntEnum这意味着我不必.value像往常一样在任何地方使用它Enum:
from enum import IntEnum
class Errors(IntEnum):
BROKEN = 0x8
FUBARED = 0x4
GIVEUP = 0x7
print(0xFF & Errors.BROKEN)
Run Code Online (Sandbox Code Playgroud)
但是,print(0xFF & ERR_1)如果我将它们全部作为有力的话,它仍然比我能得到的更加冗长.
我是初学者Java学生.所以任何帮助将不胜感激!
我设计了一个类卡和类甲板,我将在我创建的游戏中使用它.到目前为止,我的游戏似乎运行得很好,但我遇到的问题在于我的卡类.我想利用我的getRank()方法来积累玩家所拥有的牌的积分(不论其合适).
例如,如果他们画了2个钻石,那么它将值2分,3分3分......等等.我已经创建了一个String[]调用ranks来尝试这样做,我认为这就是它的作用.但是,我希望所有面部卡片(如国王,女王......)的值都为10.但并非所有这些卡片都位于我的阵列中的索引10处.我可以就如何调整此问题提供一些指导吗?
先感谢您.
int rank;
int suit;
String[]ranks = { " "," ", " " } //all 13 ranks from Ace to King
String[]suits = { " ", " ", " "} //all ranks
public Card(int rank, int suit){
this.rank = rank;
this.suit = suit;
}
public void setRank(int rank){
this.rank = rank;
}
public int getRank(){
return rank;
}
//more code for suits
public String toString(){
return ranks[rank]+" of "+suits[suit];
}
Run Code Online (Sandbox Code Playgroud) 我一直在阅读《Head First 面向对象的分析与设计》书,并且正在尝试学习 oop。
\n在本书的一页中,我读到了以下几行:
\n\n\n我们\xe2\x80\x99已经使应用程序变得不那么脆弱了。它\xe2\x80\x99现在不会那么容易被破坏,因为我们\xe2\x80\x99已经用这些枚举添加了类型安全和值安全。
\n
并且:
\n\n\n因此,您可以\xe2\x80\x99 拼写或错误键入枚举而不会出现编译器错误。它\xe2\x80\x99 是一种不仅获得类型安全,而且获得价值安全的好方法;您可以避免获得任何具有标准范围或合法值集的不良数据。
\n
我读过这个答案,但我很困惑,因为我认为答案是我们可以假设为价值安全的东西。
\n现在我的问题是类型安全和值安全之间有什么区别?\nEnum 如何为我们带来类型安全和值安全?请给我一些有关枚举中类型安全场景和值安全场景的示例。
\n谢谢。\n抱歉我的英语不好。
\n我已经声明了一个枚举类型,为它分配了一个变量,现在我将它写入控制台.那么枚举类型在现实世界的应用程序中有什么用?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Enum
{
enum cars
{
Toyota, Nissan, Ferrari, Lamborghini
}
}
class Program
{
enum cars
{
Toyota, Nissan, Ferrari, Lamborghini
}
static void Main(string[] args)
{
int a = (int)cars.Ferrari;
Console.WriteLine(a);
}
}
}
Run Code Online (Sandbox Code Playgroud) 这可能是非常明显的问题,但是如果您知道值列表会不断增加,那么使用 Enum 类好吗?
假设您首先定义一个事件枚举,它仅包含 [Poo, Too],然后我们知道我们总是有一些新的要求,它变成 [Poo, Too, App, Laa] 并且不断变化,
那么在这种情况下最好的方法是什么?
如何创建一个只允许3个不同值的变量?例如,变量color只能取3个值中的任何一个而不能取{RED, BLACK, ORANGE}其他值.
显然,我知道我可以定义String color,但是有更好的方法吗?
abstract class TV extends Electronics{
private double diagonal;
private String signal;
private int channel;
public TV() {}
public TV(LocalDate productionDate, String name, int counterOnOff, boolean isOn, double diagonal, String signal, int channel) {
super(productionDate, name, counterOnOff, isOn);
this.diagonal= diagonal;
this.signal= ????;
this.channel= channel;
}
}
Run Code Online (Sandbox Code Playgroud)
????我需要在哪里插入两个值(不完全是在那里,创建对象时我只需要从两个选项中选择)即可。我不知道如何在构造函数中实现两个选项。
我试图制作private String signal一个数组,但是它(要求)要求两个数组值,我需要从两个选项中进行选择。该课程还将有设置者和获取者。
我想创建一个定义字符串变量的类,它只能有很少的预定义值.
public class Constraint{
String const; // I want this constraint value to be fixed to either of {greaterthan,lesserthan,greaterthanequalto or lesserthanequalto}
public Constraint(String const){
this.const = const;
}
}
Run Code Online (Sandbox Code Playgroud)
如果发送任何其他值,程序应该抛出错误.我想在这里使用enum这样的东西,但我想为Strings这样做.
java ×7
enums ×5
c# ×1
class ×1
constants ×1
constructor ×1
enumeration ×1
options ×1
python ×1
spring ×1
spring-boot ×1
string ×1
type-safety ×1
types ×1