Почему нельзя получить супер доступ к атрибуту в классе в Python? - PullRequest
1 голос
/ 05 июля 2019

У меня есть вопрос.В опе, использующем python, super может получить доступ к методу или конструктору, но не к атрибутам.Почему это?

class Phone:

  def __init__(self, price, brand, camera):
    print ("Inside phone constructor")
    self.__price = price
    self.brand = brand
    self.camera = camera

def buy(self):
    print ("Buying a phone")

def return_phone(self):
    print ("Returning a phone")

class FeaturePhone(Phone):
    pass

class SmartPhone(Phone):
    def __init__(self, price, brand, camera, os, ram):
       super().__init__(price, brand, camera)
       self.os = os
      self.ram = ram
      print ("Inside smartphone constructor")

    def buy(self):
      print(super().camera) #Error
      print ("Buying a smartphone")

s=SmartPhone(20000, "Samsung", 12, "Android", 2)

print(s.buy()) #error
print(s.brand)

Может кто-нибудь объяснить, пожалуйста ??Если возможно то как?

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Сначала я подумал - это очевидно. И тогда это действительно интересный вопрос, и сегодня я узнал что-то новое.

super () не возвращает экземпляр объекта класса. Он возвращает экземпляр класса «super», который принимает в качестве аргументов класс «SmartPhone» и «SmartPhone object». Затем он запускает это закрытие.

Таким образом, вы не можете получить доступ к атрибутам суперкласса по значению super (), потому что это экземпляр "супер" класса.

https://docs.python.org/3.7/library/functions.html#super

0 голосов
/ 05 июля 2019

Вам не нужно обращаться к родительскому классу, чтобы использовать один из его методов.Ваш класс - SmartPhone наследуется от класса Phone, который позволяет вам получить доступ к его атрибутам и методам, используя self.Так что вам нужно всего лишь позвонить self.buy(), чтобы использовать метод

class Phone:
  def __init__(self, price, brand, camera):
    print ("Inside phone constructor")
    self.__price = price
    self.brand = brand
    self.camera = camera
  def buy(self):
      print ("Buying a phone")
  def return_phone(self):
      print ("Returning a phone")

class FeaturePhone(Phone):
    pass

class SmartPhone(Phone):
    def __init__(self, price, brand, camera, os, ram):
      super().__init__(price, brand, camera)
      self.os = os
      self.ram = ram
      print ("Inside smartphone constructor")
    def buy(self):
      print(self.camera) 
      print ("Buying a smartphone")

s=SmartPhone(20000, "Samsung", 12, "Android", 2)

print(s.buy()) # this works
print(s.brand)
...