Python calling method in class

前端 未结 3 1321
予麋鹿
予麋鹿 2020-12-07 17:04

I\'m punching way above my weight here, but please bear with this Python amateur. I\'m a PHP developer by trade and I\'ve hardly touched this language before.

What I

相关标签:
3条回答
  • 2020-12-07 17:17

    Let's say you have a shiny Foo class. Well you have 3 options:

    1) You want to use the method (or attribute) of a class inside the definition of that class:

    class Foo(object):
        attribute1 = 1                   # class attribute (those don't use 'self' in declaration)
        def __init__(self):
            self.attribute2 = 2          # instance attribute (those are accessible via first
                                         # parameter of the method, usually called 'self'
                                         # which will contain nothing but the instance itself)
        def set_attribute3(self, value): 
            self.attribute3 = value
    
        def sum_1and2(self):
            return self.attribute1 + self.attribute2
    

    2) You want to use the method (or attribute) of a class outside the definition of that class

    def get_legendary_attribute1():
        return Foo.attribute1
    
    def get_legendary_attribute2():
        return Foo.attribute2
    
    def get_legendary_attribute1_from(cls):
        return cls.attribute1
    
    get_legendary_attribute1()           # >>> 1
    get_legendary_attribute2()           # >>> AttributeError: type object 'Foo' has no attribute 'attribute2'
    get_legendary_attribute1_from(Foo)   # >>> 1
    

    3) You want to use the method (or attribute) of an instantiated class:

    f = Foo()
    f.attribute1                         # >>> 1
    f.attribute2                         # >>> 2
    f.attribute3                         # >>> AttributeError: 'Foo' object has no attribute 'attribute3'
    f.set_attribute3(3)
    f.attribute3                         # >>> 3
    
    0 讨论(0)
  • 2020-12-07 17:23

    Could someone explain to me, how to call the move method with the variable RIGHT

    >>> myMissile = MissileDevice(myBattery)  # looks like you need a battery, don't know what that is, you figure it out.
    >>> myMissile.move(MissileDevice.RIGHT)
    

    If you have programmed in any other language with classes, besides python, this sort of thing

    class Foo:
        bar = "baz"
    

    is probably unfamiliar. In python, the class is a factory for objects, but it is itself an object; and variables defined in its scope are attached to the class, not the instances returned by the class. to refer to bar, above, you can just call it Foo.bar; you can also access class attributes through instances of the class, like Foo().bar.


    Im utterly baffled about what 'self' refers too,

    >>> class Foo:
    ...     def quux(self):
    ...         print self
    ...         print self.bar
    ...     bar = 'baz'
    ...
    >>> Foo.quux
    <unbound method Foo.quux>
    >>> Foo.bar
    'baz'
    >>> f = Foo()
    >>> f.bar
    'baz'
    >>> f
    <__main__.Foo instance at 0x0286A058>
    >>> f.quux
    <bound method Foo.quux of <__main__.Foo instance at 0x0286A058>>
    >>> f.quux()
    <__main__.Foo instance at 0x0286A058>
    baz
    >>>
    

    When you acecss an attribute on a python object, the interpreter will notice, when the looked up attribute was on the class, and is a function, that it should return a "bound" method instead of the function itself. All this does is arrange for the instance to be passed as the first argument.

    0 讨论(0)
  • 2020-12-07 17:27

    The first argument of all methods is usually called self. It refers to the instance for which the method is being called.

    Let's say you have:

    class A(object):
        def foo(self):
            print 'Foo'
    
        def bar(self, an_argument):
            print 'Bar', an_argument
    

    Then, doing:

    a = A()
    a.foo() #prints 'Foo'
    a.bar('Arg!') #prints 'Bar Arg!'
    

    There's nothing special about this being called self, you could do the following:

    class B(object):
        def foo(self):
            print 'Foo'
    
        def bar(this_object):
            this_object.foo()
    

    Then, doing:

    b = B()
    b.bar() # prints 'Foo'
    

    In your specific case:

    dangerous_device = MissileDevice(some_battery)
    dangerous_device.move(dangerous_device.RIGHT) 
    

    (As suggested in comments MissileDevice.RIGHT could be more appropriate here!)

    You could declare all your constants at module level though, so you could do:

    dangerous_device.move(RIGHT)
    

    This, however, is going to depend on how you want your code to be organized!

    0 讨论(0)
提交回复
热议问题