Подтвердить что ты не робот

Что означают сами классы - это объекты?

Я просто читал о документации по классам python, говорит он, в python "сами классы являются объектами". Как отличается от классов С# или Java? Какие преимущества и недостатки этот тип классов сравнивается с С# или Java?

4b9b3361

Ответ 1

В Python классы являются объектами в том смысле, что вы можете назначить их переменным, передать их функциям и т.д., как и любые другие объекты. Например

>>> t = type(10)
>>> t
<type 'int'>
>>> len(t.__dict__)
55
>>> t() # construct an int
0
>>> t(10)
10

Java имеет объекты Class, которые предоставляют некоторую информацию о классе, но вы не можете использовать их вместо явных имен классов. Они на самом деле не классы, а просто классовые информационные структуры.

Class C = x.getClass();
new C(); // won't work

Ответ 2

Объявление класса просто объявляет переменную:

class foo(object):
    def bar(self): pass
print foo # <class '__main__.foo'>

Они могут быть назначены и сохранены как любая переменная:

class foo(object):
    pass
class bar(object):
    pass
baz = bar # simple variable assignment
items = [foo, bar]
my_foo = items[0]() # creates a foo
for x in (foo, bar): # create one of each type
    print x()

и передается как переменная:

class foo(object):
    def __init__(self):
        print "created foo"
def func(f):
    f()

func(foo)

Они могут быть созданы с помощью функций, включая список базового класса:

def func(base_class, var):
    class cls(base_class):
        def g(self):
            print var
    return cls

class my_base(object):
    def f(self): print "hello"

new_class = func(my_base, 10)
obj = new_class()
obj.f() # hello
obj.g() # 10

В отличие от этого, в то время как классы на Java имеют объекты, представляющие их, например. String.class, само имя класса - String - не является объектом и не может быть обработано как одно. Это присуще статически типизированным языкам.

Ответ 3

В С# и Java классы не являются объектами. Они являются типами, в том смысле, в которых эти языки статически типизированы. Правда, вы можете получить объект, представляющий определенный класс, но это не то же самое, что и сам класс.

В python то, что похоже на класс, на самом деле тоже объект.

Он exlpained здесь намного лучше, чем я когда-либо мог:)

Ответ 4

Основное отличие состоит в том, что они означают, что вы можете легко манипулировать классом как объектом. Тот же объект доступен на Java, где вы можете использовать методы Class, чтобы получить информацию о классе объекта. В таких языках, как Python, Ruby и Smalltalk, более динамичный характер языка позволяет вам "открыть" класс и изменить его, что иногда называется "исправление обезьян".

Лично я не думаю, что эти разногласия очень важны, но я уверен, что мы сможем начать с ним хорошую религиозную войну.

Ответ 5

Классы - это объекты, в которых они манипулируют в коде Python так же, как и любой объект. Другие продемонстрировали, как вы можете передать их функциям, позволяя им работать как любой объект. Вот как вы можете это сделать:

class Foo(object):
    pass

f = Foo()

f.a = "a"    # assigns attribute on instance f
Foo.b = "b"  # assigns attribute on class Foo, and thus on all instances including f

print f.a, f.b

Во-вторых, как и все объекты, классы создаются во время выполнения. То есть определение класса - это код, который выполняется, а не структура, которая скомпилирована до того, как что-либо будет запущено. Это означает, что класс может "запекать" вещи, которые известны только при запуске программы, такие как переменные среды или пользовательский ввод. Они оцениваются один раз, когда класс объявляется, а затем становятся частью класса. Это отличается от скомпилированных языков, таких как С#, для которых требуется, чтобы подобное поведение выполнялось по-разному.

Наконец, классы, как и любой объект, строятся из классов. Так же, как объект построен из класса, так и класс, построенный из специального класса, называемого метаклассом. Вы можете написать свои собственные метаклассы, чтобы изменить способ определения классов.

Ответ 6

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

>>> class MyClass(object):
...     def foo(self):
...         print "Yo There! I'm a MyCLass-Object!"
...
>>> class YourClass(object):
...     def foo(self):
...         print "Guess what?! I'm a YourClass-Object!"
...
>>> o = MyClass()
>>> o.foo()
Yo There! I'm a MyCLass-Object!
>>> o.__class__ = YourClass
>>> o.foo()
Guess what?! I'm a YourClass-Object!

У объектов есть специальный атрибут __class__, который указывает на класс, являющийся экземпляром. Это возможно только потому, что классы являются самими объектами и поэтому могут быть привязаны к атрибуту типа __class__.

Ответ 7

Поскольку этот вопрос имеет тег Smalltalk, этот ответ берется с точки зрения Smalltalk. В объектно-ориентированном программировании все происходит через передачу сообщений. Вы отправляете сообщение объекту, если объект понимает это сообщение, он выполняет соответствующий метод и возвращает значение. Но как создается объект в первую очередь? Если для создания объектов используется специальный синтаксис, который разбивает простой синтаксис на основе передачи сообщений. Это то, что происходит в таких языках, как Java:

p = new Point(10, 20); // Creates a new Point object with the help of a special keyword - new.
p.draw(); // Sends the message `draw` to the Point object.

Как видно из приведенного выше кода, язык имеет два способа добиться успеха - один императив и другой объектно-ориентированный. Напротив, Smalltalk имеет последовательный синтаксис, основанный только на обмене сообщениями:

p := Point new: 10 y: 20.
p draw.

Здесь new - это сообщение, отправляемое на одноэлементный объект с именем Point, который является экземпляром Metaclass. Помимо предоставления языку согласованной модели вычислений, метаклассы допускают динамическую модификацию классов. Например, следующий оператор добавит новую переменную экземпляра в класс Point, не требуя повторной компиляции или перезагрузки VM:

Point addInstVarName: 'z'.

Лучшее чтение по этому вопросу Искусство протокола метаобъектов.