можно ли вызвать функцию через точку от переменной?
В этом случае методу method()
передаются атрибуты объекта object
.
class Object:
def method(self):
#do smth
object.method()
Возможно ли вообще что-то такое с переменными?
def method(self):
return self.uppercase()
# 'VALUE'
variable = 'value'
variable.method()
Ответы (3 шт):
Да, возможно.
Только вот переменная - это все равно объект класса, у которого есть методы.
Взять например строку:
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/
Можно создать свой класс, наследовать класс 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 Это мой метод!
Строка тоже объект и как и у любого объекта, у него есть свои методы. Добавить метод, для уже существующего типа объекта, называется Методы расширения
в C#
или Открытый класс
в Ruby
, а в JavaScript
, Perl
или Python
есть только техника подмены Обезьяний патч
. К сожалению в Phyton
нельзя добавить метод для встроенных типов и это не случайно. Конечно есть варианты с костылями, но лучше всё таки так не делать. Все языки это инструмент и как у любого инструмента, есть правильный вариант использования, у каждого языка есть свой Guideline Style.
Или использовать Запретный фрукт, который позволит это сделать, но его название буквально говорящее и это очень не рекомендуется.
Add a
classmethod
to thestr
class:
from forbiddenfruit import curse
def hello(self):
return "blah"
curse(str, "hello", classmethod(hello))
assert str.hello() == "blah"