快速概述OOP php到python?

时间:2011-03-15 16:51:16

标签: python

我来自PHP并快速学习OOP Python基础PHP的知识 例如,我有一个班级

<?php
class Cat{
    private $name;
    private $age;
    private $color;

    public function getName()
    {
        return $this->name;
    }

    public function setName($value)
    {
        $this->name = $value;
    }

    public function getAge()
    {
        return $this->age;
    }

    public function setAge($value)
    {
        $this->age = $value;
    }

    public function getColor()
    {
        return $this->color;
    }

    public function setColor($value)
    {
        $this->color = $value;
    }

}
?>

什么是python OOP代码的等价物?

5 个答案:

答案 0 :(得分:8)

class Cat(object):
    def __init__(self, name, age, color):
        self.name = name
        self.age = age
        self.color = color

不,我不是在开玩笑。

  1. 切掉那个getter / setter的东西,我们有一些属性是有原因的。
  2. 如果你有一个属性,你最好总是拥有它(即从创建开始),或者AttributeError随之而来。即使PHP允许你沉默(Python没有),它们在所有语言中都是“代码味道”。
  3. 在Python 2.x中,您需要从object(直接或间接)继承 - 否则,您将从过去的旧式类中获得其中一个令人讨厌的遗留物。只是不要理会它。在Python 3中,你不需要那个样板文件(旧式类已经不存在了,如果没有别的话,一切都继承object。)
  4. 这很重要:你不会通过比较一些简短的片段来学习Python(或任何其他语言)。阅读教程,一些真实的代码和关于SO的Python问题。此外,练习练习并检查代码。

答案 1 :(得分:3)

完全相同的是:

class Cat(object):
    def __init__(self, name...):
        self.__name = name # __ make the var private
        ...

    def getName(self):
        return self.__name

    def setName(self, name):
        self.__name = name

    ...

它会起作用,但你永远不会在Python中这样做。原因如下:

  • Python中没有什么是私密的,你总是可以使用这种语言中的一些技巧来绕过限制。因此,您通常会重视执行行为的更多通信,文档和API。
  • 直接访问属性在Python中完全没问题。如果你在获取或设置时没有特别的东西,那么你就不会写getter和setter。最好的Python库可以做到这一点。
  • 你有一些叫做“属性”的东西,让你在事后改变主意。如果在1个月内,您决定在获取和设置var时执行某些操作,则可以在不更改API的情况下执行此操作。

以下是如何使用适当的Python:

class Cat(object):
    def __init__(self, name):
        self.name = name

c = Cat('billy')
print c.name
# billy
c.name = 'kit'
print c.name
# kit

现在,如果突然想要改变主意并确保名称在存储时始终能够充分利用,该怎么办?您只需添加一个属性:

class Cat(object):

    def __init__(self, name):
        self._name = name # '_' is just a convention and does nothing

    @property # when you do cat.name, it will call this function
    def name(self):
        return self._name

    @name.setter # when you do cat.name = x, it will call this function
    def name(self, name):
        """ Make the name uppercase when setting it """
        self._name = name.upper()

代码更改,但从外部看,它看起来完全一样:

c = Cat('billy')
print c.name
# BILLY
c.name = 'kit'
print c.name
# KIT

主要好处是什么?

  • 您不必在大多数情况下编写getter和setter,同时也可以缩短代码,因此更容易阅读。
  • 如果你改变主意,你总是可以写一个getter / setter。只有你需要的那个,而不是所有其他的。 API保持一致。

答案 2 :(得分:2)

class Cat(object):
   def __init__(self, name, age, color):
        self.name = name
        self.age = age
        self.color = color

在Python中通常不使用setter和getter;你可以使用property,如果你真的需要做一些奇特的事情,那么接口就不需要改变了。如果您决定为您设置的每个值添加5,则不必更改界面,因此无需键入额外的功能。

顺便说一句,这不是真正的OOP。它只是一个用Python拼写的C结构。如果你想为宠物猫添加OOP风格的方法,你可以。只需将其添加到课程中:

def pet(self):
    # Do whatever petting does to a cat.
    pass

答案 3 :(得分:2)

每个人都有很好的答案,但我想我会包含一个内置property函数的示例。

class Cat(object):
    def __init__(sef, name, age, color):
        self._name = name
        self._age = age
        self._color = color

    def get_name(self):
        return self._name

    def set_name(self, value):
        self._name = value

    def get_age(self):
        return self._age    

    def set_age(self, value):
        self._age = value

    def get_color(self):
        return self._color

    def set_color(self, value):
        self._color = value

    name = property(get_name, set_name)
    age = property(get_age, set_age)
    color = property(get_color, set_color)

答案 4 :(得分:1)

您的代码更像this

但是,除非您需要自定义setter和getter,否则请不要这样做。

相关问题