Я программирую на Python уже 5 лет (с 2017 года) и узнал об этих фактах совсем недавно.
Я программирую на Python уже 5 лет (с 2017 года) и совсем недавно узнал о следующих фактах — поехали:
1) Частные переменные в классах на самом деле не являются частными
class Dog(): def __init__(self, name): self.__name = name @property def name(self): return self.__name
В этом классе Dog
атрибут __name
имеет метод getter, но не метод setter. По праву мы, как пользователи, должны иметь возможность только читать атрибут __name
и не иметь права устанавливать новое имя для нашего объекта Dog
. Но приватные переменные не такие приватные.
dog = Dog("rocky") print(dog.__dict__) # {'_Dog__name': 'rocky'}
Атрибут __dict__
содержит все атрибуты объекта. Используя атрибут __dict__
, мы можем контролировать даже те переменные и атрибуты, к которым у нас не должно быть доступа.
dog.__dict__["_Dog__name"] = "fifi" print(dog.name) # fifi
2) Мы можем использовать type() для создания классов без ключевого слова class
ClassName = type(__name__, __bases__, __dict__)
__name__
это имя класса__bases__
— это кортеж, содержащий классы, от которых этот класс наследует__dict__
— это словарь, содержащий атрибуты и методы
Обычный способ создания класса Dog
:
class Dog(): def __init__(self, name, age): self.name = name self.age = age def bark(self): print("woof")
Создание класса Dog
с помощью функции type()
:
def init(self, name, age): self.name = name self.age = age def bark(self): print("woof") Dog = type("Dog", (), {"__init__":init, "bark":bark})
3) Мы получим это, если добавим список к самому себе
lis = [4,5,6] lis.append(lis) print(lis) # [4, 5, 6, [...]]
...
известен как многоточие в Python и может использоваться вместо ключевого слова pass
. Я никогда раньше не использовал это в своей работе, хотя
4) Бесконечные значения в Python
a = float("inf") b = float("-inf") print(a, b) # inf -inf
Мы можем создавать значения бесконечности (и отрицательной бесконечности) в Python. Все остальные числа меньше inf
и больше -inf
print(10**100000 > float("inf")) # False print(-(10**10000) < float("-inf")) # False
5) Мы можем использовать классы в качестве декораторов
Допустим, у нас есть простая функция, которая приветствует кого-то
def hello(name): return "hello " + name print(hello("fifi")) # hello fifi
Давайте напишем наш класс декоратора и используем его при определении нашей функции hello
.
class append(): def __init__(self, char): self.char = char def __call__(self, function): def inner(*args): return function(*args) + self.char return inner @append("!") def hello(name): return "hello " + name print(hello("fifi")) # hello fifi!
Мы также можем использовать несколько декораторов для одной функции:
@append("?") @append("!") def hello(name): return "hello " + name print(hello("fifi")) # hello fifi!?
6) Мы можем использовать китайские иероглифы в качестве имен переменных
我 = 4 你 = 5 print(我 + 你) # 9
Я не пробовал использовать другие языки, но дайте мне знать, если вы попробуете их. Однако это не очень полезное знание (если только вы действительно не хотите разозлить своих коллег).
7) Мы можем использовать eval() для запуска кода Python в строках
Мы можем использовать встроенную функцию eval()
для запуска кода Python в строках.
x = 4 y = eval("x + 10") print(y) # 14
Еще пара примеров:
string = "print('hello world')" eval(string) # prints hello world string = "1+2+3" eval(string) # returns 6
Заключение
Я законно не знал этих фактов до недавнего времени (вероятно, мне следовало знать раньше, но это то, что есть). Надеюсь, это было интересное чтение!
Несколько заключительных слов
Если эта статья была полезной и вы хотите поддержать меня, подумайте о том, чтобы подписаться на членство в Medium — это стоит 5 долларов в месяц, и вы получаете неограниченный доступ к статьям на Medium. Если вы зарегистрируетесь по моей ссылке ниже, я получу небольшую комиссию без каких-либо дополнительных затрат для вас.
Я пишу статьи о программировании (в основном о Python), которые, как мне кажется, помогли бы мне, когда я был моложе, ускорить процесс обучения. Присоединяйтесь к моему списку адресов электронной почты, чтобы получать уведомления о каждой публикации.
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Посетите наш Community Discord и присоединитесь к нашему Коллективу талантов.