Как моя функция узнает, какой класс она получает? - PullRequest
0 голосов
/ 01 февраля 2019

Я очень новичок в Python и просто действительно копаюсь во всех областях понимания классов / объектов.Вот с чем я действительно борюсь: если у меня есть класс «утка» с атрибутами и функциями-членами в файле duck.py, и я работаю с функцией в witch.py, которая принимает класс утки. Я выполняю инструкцию import

import duck

Тогда в моей функции:

def doesitfloat(myduck, mywitch):
    if myduck.boyancy() == 'floats':
    ...

как 'diditfloat' узнает, что myduck является утиным объектом с указанными атрибутами / функциями-членами?Я думаю, что я понимаю общие понятия о классах, но когда я создаю один, как я могу использовать его в другом месте?

Редактировать ... Мой первый пост и новичок в Python - что я могусказать.Позвольте мне изложить ..

В моем файле класса duck.py у меня есть:

class duck:
    def buoyancy(self):
        return True

В другом файле witch.py ​​у меня есть функция diditfloat () с соответствующим импортом

import duck

def doesitfloat(myduck, mywitch)
    if myduck.buoyancy() == 'floats':
    ...

Откуда «diditfloat» знает, что myduck - это объект или тип «утка»?Теперь, в другом фрагменте кода - возможно, даже в третьем файле, с соответствующим объявленным импортом, у меня есть следующее:

someduck = duck
somewitch = witch  

testingsomething = doesitfloat(someduck, somewitch)

ясно, что класс объявлен, и локально в моем третьем файле я объявил someduck инекоторые объектыТем не менее, функция 'doesitfloat' никогда не говорит, что это объект "утка".В других языках объявление 'doesitfloat' явно указывало бы тип аргумента, но python ... ??Извините, меня это смущает.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Действительно, вы только что реализовали один из указателей в python, он даже называется программирование утки так сказать если он ходит и говорит как утка, то это утка .

Программа не знает ранее, будет ли данный объект иметь указанный метод, она пытается получить к нему доступ (возвращает ошибку, если не находит).

Это зависит от разработчика.использование кода для соблюдения цели кода.

В python при попытке запуска myduck.boyancy() python пытается получить доступ к атрибуту / методу boyancy объекта, на который ссылается переменная myduck, и еслион не находит никакого атрибута / метода, он вернет ошибку.

0 голосов
/ 01 февраля 2019

Python - это язык с динамической типизацией.

Во многих языках вам необходимо явно объявить тип с переменной, например, в C #:

Duck duck = new Duck();
...
duck = new Frog(); // This throws an error in a statically typed language

В Python каждая переменная имеет видссылка на объект python.Эти объекты знают свой собственный тип и содержат свойства и методы класса или примитива, из которого они построены.

duck = Duck()
...
duck = Frog() # This changes the duck variable to reference a new Frog object instead

Если вы попытаетесь получить доступ к члену объекта, который не существует, python выдастошибка.

Вы можете проверить, действительно ли переменная ссылается на утку, используя функцию isinstance():

if isinstance(duck, Duck):
    # ... now we know duck is a Duck or Duck sub-class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...