Это - невоспитанность для вызова classmethod как метода от экземпляра?

Чтобы проверить, является ли объект числом (Int в вашем случае), вы можете сделать две вещи:

  1. Проверка типа через is или as? [1130 ]

    • Это проверяет только тип, а не содержимое

      let isNumberType = "1" is Int
      print(isNumberType) //false because "1" is of type String
      
  2. Создание Int через его инициализатор [1132 ]

    • Возвращает Int?, потому что он может потерпеть неудачу, поэтому проверьте далее != nil

      let something = "1"
      let isNumber = Int(something) != nil
      print(isNumber) //true because "1" can be made into an Int
      
<час>

ПРИМЕЧАНИЕ. Согласно вашему примеру, вы проверяете только четные элементы, поэтому мы будем использовать stride(from:to:by:)

Решение № 1:

Предполагая, что у вас есть массив String с, мы можно использовать инициализатор Int, чтобы проверить, может ли элемент string быть числом, например:

func check(expression: [String]) -> Bool {
    for idx in stride(from: 0, to: expression.count, by: 2) {
        let isNumeric = Int(expression[idx]) != nil
        if isNumeric == false {
            return false
        }
    }

    return true
}

check(expression: ["1", "A", "2", "B", "3", "C"]) //true
check(expression: ["1", "A", "2", "B", "E", "C"]) //false

Решение №2:

Предполагая, что ваш массив имеет наберите [Any], и вы хотите напечатать, проверьте, чтобы альтернативные элементы были Int, затем используйте is, например, так:

func check(expression: [Any]) -> Bool {
    for idx in stride(from: 0, to: expression.count, by: 2) {
        let isNumeric = expression[idx] is Int
        if isNumeric == false {
            return false
        }
    }

    return true
}

check(expression: [1, "A", 2, "B", 3, "C"])   //true
check(expression: [1, "A", 2, "B", "3", "C"]) //false

С [Any] дело в том, что его элементы не могут быть подается непосредственно в инициализатор Int, не внося его в o приемлемый тип.
Так что в этом примере, для простоты, мы просто проверяем, принадлежит ли объект точно типу Int или нет.
Поэтому я сомневаюсь, что это соответствует вашему требованию.

35
задан Bill the Lizard 28 March 2009 в 02:54
поделиться

5 ответов

Если Вы испытываете желание назвать метод класса от экземпляра, Вам, вероятно, не нужен метод класса.

В примере Вы дали статический метод, будет более соответствующим точно из-за Вашего последнего комментария (никакое self/cls взаимодействие).

class C(object):
    @staticmethod
    def f(x):
       return x + x

этим путем это - "хорошая форма", чтобы сделать обоих

c = C()
c.f(2)

и

C.f(2)
31
ответ дан Toni Ruža 27 November 2019 в 07:15
поделиться

Это главным образом просто путает взгляд. Если бы я использовал Ваш класс и видел это, то он заставил бы меня задаться вопросом, что другие неожиданности там, он просто похож на плохой дизайн.

Существует ли причина, это не просто staticmethod?

5
ответ дан Trey Stout 27 November 2019 в 07:15
поделиться

Я не вспоминаю использование classmethod как это снаружи класса, но это, конечно, хорошо для метода экземпляра назвать classmethod на себе (например. self.foo() где foo classmethod). Это удостоверяется, что наследование действует как ожидалось и будет звонить .foo() в правильном подклассе вместо базового класса.

10
ответ дан Matt Good 27 November 2019 в 07:15
поделиться

C.f() более ясно, чем c_instance.f(), и c_instance.__class__.f() просто ужасно. Так как ясность и красота являются нежно любимыми характеристиками в сообществе Python, я был бы склонен говорить, что C.f () является оптимальным маршрутом.

Есть ли какая-либо конкретная причина, которую Вы даже хотите назвать им любым из других способов?

3
ответ дан vezult 27 November 2019 в 07:15
поделиться

Если у Вас уже есть экземпляр C, почему Вам нужен f (), чтобы быть методом класса? Не только это невоспитанность, обычно не необходимый. Кто-то в сети говорит: "Это плохо, потому что это создает впечатление, что некоторые переменные экземпляра в объекте используются, но это не имеет место".

Хотя, страница 484 изучения Python отмечает, что можно назвать метод так или иначе, и это будет точно то же, пока Вы передаете тот же экземпляр в.

3
ответ дан John Ellinwood 27 November 2019 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: