我来自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代码的等价物?
答案 0 :(得分:8)
class Cat(object):
def __init__(self, name, age, color):
self.name = name
self.age = age
self.color = color
不,我不是在开玩笑。
AttributeError
随之而来。即使PHP允许你沉默(Python没有),它们在所有语言中都是“代码味道”。object
(直接或间接)继承 - 否则,您将从过去的旧式类中获得其中一个令人讨厌的遗留物。只是不要理会它。在Python 3中,你不需要那个样板文件(旧式类已经不存在了,如果没有别的话,一切都继承object
。)答案 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:
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
主要好处是什么?
答案 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,否则请不要这样做。