можно ли вызвать функцию через точку от переменной?

В этом случае методу method() передаются атрибуты объекта object.

class Object:
    def method(self):
        #do smth

object.method()

Возможно ли вообще что-то такое с переменными?

def method(self):
    return self.uppercase()
    # 'VALUE'

variable = 'value'
variable.method()

Ответы (3 шт):

Автор решения: dresqd

Да, возможно.

Только вот переменная - это все равно объект класса, у которого есть методы.

Взять например строку:

test_str = 'abc_abc'  # по вашему - переменная
test_str = str('abc_abc')  # на деле интерпретатор превращает строку выше в это, т.е. инициализирует экземпляр класса, так что переменных, как таковых - не существует

Фактически получаем объект класса str.

И можно вызвать метод "переменной" split, например с выводом в консоль.

print(test_str.split('_'))

Если возникла необходимость в создании собственного типа данных(класса) - можете ознакомиться, например, с этим материалом: https://docs-python.ru/tutorial/klassy-jazyke-python/sozdanie-sobstvennyh-tipov-dannyh-struktury/

→ Ссылка
Автор решения: Amgarak

Можно создать свой класс, наследовать класс str или int или любой другой тип и добавить свой метод.

class MyString(str): # Наследуемся от класса str
    def my_method(self):
        return "Это мой метод!"

# Создаем экземпляр класса, передаем строку
variable = MyString("Привет, мир!")

# Используем переменную как обычно + наш метод
print(variable," ",variable.my_method())

Но важно уточнить, если мы будем как то изменять нашу кастомную переменную, стандартные методы будут возвращать базовый объект класса без наших дополнительных методов:

class MyInt(int):
    def my_method(self):
        return "Это мой метод!"

number = MyInt(55)
number += 2
print(number, " ", number.my_method())

Ошибка:

Traceback (most recent call last):
  File "C:\Users\Amgarak\Desktop\13.py", line 12, in <module>
    print(number, " ", number.my_method())
                       ^^^^^^^^^^^^^^^^
AttributeError: 'int' object has no attribute 'my_method'

Что бы этого избежать, придётся переопределять любой метод который мы используем будь то сложение, умножение и т.д. что бы он возвращал объект нашего класса с нашим же дополнительным методом:

class MyInt(int):
    def __add__(self, other):
        return MyInt(super().__add__(other))

    def my_method(self):
        return "Это мой метод!"

number = MyInt(55)
number += 2

print(number, " ", number.my_method())

Вывод:

57   Это мой метод!
→ Ссылка
Автор решения: Yaroslav

Строка тоже объект и как и у любого объекта, у него есть свои методы. Добавить метод, для уже существующего типа объекта, называется Методы расширения в C# или Открытый класс в Ruby, а в JavaScript, Perl или Python есть только техника подмены Обезьяний патч. К сожалению в Phyton нельзя добавить метод для встроенных типов и это не случайно. Конечно есть варианты с костылями, но лучше всё таки так не делать. Все языки это инструмент и как у любого инструмента, есть правильный вариант использования, у каждого языка есть свой Guideline Style.

Или использовать Запретный фрукт, который позволит это сделать, но его название буквально говорящее и это очень не рекомендуется.

Add a classmethod to the str class:

from forbiddenfruit import curse


def hello(self):
    return "blah"


curse(str, "hello", classmethod(hello))

assert str.hello() == "blah"
→ Ссылка