{"id":3752,"date":"2016-03-07T06:00:31","date_gmt":"2016-03-07T11:00:31","guid":{"rendered":"http:\/\/kodegeek.com\/blog\/?p=3752"},"modified":"2016-03-06T10:56:48","modified_gmt":"2016-03-06T15:56:48","slug":"slots-abstracts-classes-en-python-3","status":"publish","type":"post","link":"http:\/\/kodegeek.com\/blog\/2016\/03\/07\/slots-abstracts-classes-en-python-3\/","title":{"rendered":"Slots, Abstracts classes en Python 3"},"content":{"rendered":"<p>\u00bfSe acuerdan del ejemplo anterior usando classes en Python? En este caso hice un par de cambios para aprender m\u00e1s sobre clases abstractas y slots (una manera de ahorrar memoria en Python cuando creamos objetos).<\/p>\n<p>En este caso:<\/p>\n<ul>\n<li>Uso un &#8216;slot&#8217; para guardar s\u00f3lo 3 atributos que son definidos en el constructor<br \/>\nDeclaro la propiedad &#8216;party&#8217; como abstracta ya que quiero que el que extienda las clases se vea forzado a implementar un m\u00e9todo adecuado que me diga de que partido viene<br \/>\nTambi\u00e9n obligo al usuario a declarar el m\u00e9todo &#8216;__bool__&#8217; el cual utilizo para saber si es Democrata u otra clase (si, el ejemplo es forzado :-))<\/li>\n<\/ul>\n<pre lang=\"python\">#!\/usr\/bin\/env python3\r\n# A little fun with the candidates for the US presidency for 2016 election year\r\n# Revisited versions with slots, abstract classes\r\n# @author josevnz@kodegeek.com\r\n#\r\nimport abc\r\n\r\nclass Candidate(metaclass=abc.ABCMeta):\r\n    \r\n    __slots__ = (\"__name\", \"__sex\", \"__age\")\r\n\r\n    @abc.abstractmethod    \r\n    def __init__(self, name, sex=\"F\", age=21):\r\n        self.__name = name\r\n        self.__sex = \"F\" if sex not in [\"M\", \"F\"] else sex\r\n        self.__age = 21 if not (21 &lt; = age &lt;= 120) else age\r\n    \r\n    @property\r\n    def name(self):\r\n        return self.__name\r\n    \r\n    def get_party(self):\r\n        raise NotImplemented()\r\n    \r\n    party = abc.abstractproperty(get_party)\r\n    \r\n    @property\r\n    def sex(self):\r\n        return self.__sex\r\n    \r\n    @property\r\n    def age(self):\r\n        return self.__age\r\n    \r\n    def __hash__(self):\r\n        return hash(id(self))\r\n    \r\n    def __str__(self):\r\n        return \"{}=[name={}, sex={}, age={}]\".format(self.__class__.__name__,\r\n                                                            self.__name,\r\n                                                            self.__sex,\r\n                                                            self.__age\r\n                                                            )\r\n    \r\n    def __repr__(self):\r\n        return \"{}({}{}{}{})\".format(\r\n                                 self.__class__.__name__, \r\n                                 self.__name, \r\n                                 self.__sex, \r\n                                 self.__age\r\n                                )\r\n    \r\n    @abc.abstractmethod\r\n    def __bool__(self):\r\n        raise NotImplemented()\r\n    \r\n    def __lt__(self, other):\r\n        return self.__age < other.__age \r\n\r\n     def __gt__(self, other): \r\n        return self.__age > other.__age\r\n    \r\n    def __eq__(self, other):\r\n        return (\r\n                self.__age == other.__age and \r\n                self.__name == other.__name and\r\n                self.__sex == other.__sex\r\n                )\r\n\r\nclass Republican(Candidate):\r\n    \r\n    def __init__(self, name, sex=\"F\", age=21):\r\n        return super().__init__(name, sex, age)\r\n    \r\n    party = \"Republican Party (GOP)\"\r\n    \r\n    def __bool__(self):\r\n        return False\r\n            \r\nclass Democrat(Candidate):\r\n    \r\n    def __init__(self, name, sex=\"F\", age=21):\r\n        return super().__init__(name, sex, age)\r\n    \r\n    party = \"Democratic Party\"\r\n    \r\n    def __bool__(self):\r\n        return True\r\n    \r\nif __name__ == \"__main__\":\r\n        candidates = []\r\n        candidates.append(Democrat(\"Hillary Clinton\", \"F\", 68))\r\n        candidates.append(Republican(\"Donald Trump\", \"M\", 70))\r\n        candidates.append(Democrat(\"Bernie Sanders\", \"M\", 75))\r\n        candidates.append(Republican(\"Marco Rubio\", \"M\", 45))\r\n        for candidate in sorted(candidates, reverse=True):\r\n            isDemocrat = \"yes\" if candidate else \"no\"\r\n            print(\"Candidate: {}, democrat? {}\".format(candidate, isDemocrat))        \r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfSe acuerdan del ejemplo anterior usando classes en Python? En este caso hice un par de cambios para aprender m\u00e1s sobre clases abstractas y slots (una manera de ahorrar memoria en Python cuando creamos objetos). En este caso: Uso un &#8216;slot&#8217; para guardar s\u00f3lo 3 atributos que son definidos en el constructor Declaro la propiedad <a class=\"read-more\" href=\"http:\/\/kodegeek.com\/blog\/2016\/03\/07\/slots-abstracts-classes-en-python-3\/\">[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[194,438,239],"tags":[795,797,765,796],"_links":{"self":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/3752"}],"collection":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/comments?post=3752"}],"version-history":[{"count":4,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/3752\/revisions"}],"predecessor-version":[{"id":3756,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/3752\/revisions\/3756"}],"wp:attachment":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/media?parent=3752"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/categories?post=3752"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/tags?post=3752"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}