Я программирую на 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. Если вы зарегистрируетесь по моей ссылке ниже, я получу небольшую комиссию без каких-либо дополнительных затрат для вас.

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

Я пишу статьи о программировании (в основном о Python), которые, как мне кажется, помогли бы мне, когда я был моложе, ускорить процесс обучения. Присоединяйтесь к моему списку адресов электронной почты, чтобы получать уведомления о каждой публикации.



Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Посетите наш Community Discord и присоединитесь к нашему Коллективу талантов.