创建类:
class class_name(upper):
类的初始化:
- class Test:
- def __init__(self, foo):
- self.__foo = foo
- def __bar(self):
- print(self.__foo)
- print('__bar')
- ...
- __var
- __function_name()
以双下划线开头的表示私有属性或方法
可以用 getter 或 setter 方法获得
定义 getter 方法
- @property
- def name(参数):
- return or print()
- @name.setter
- def name(参数):
- self._name=name
必须现有 getter 方法才能设置 setter 方法
...
还可以以一种方法访问:
- class Test:
- def __init__(self, foo):
- self.__foo = foo
- def __bar(self):
- print(self.__foo)
- print('__bar')
- def main():
- test = Test('hello')
- test._Test__bar() # _Test 访问
- print(test._Test__foo)
- if __name__ == "__main__":
- main()
面向对象进阶
__slots__限制当前类绑定的属性
- # 限定 Person 对象只能绑定_name, _age 和_gender 属性
- __slots__ = ('_name', '_age', '_gender')
静态方法
- # Python 有有静态方法和类方法, 静态方法通过类名调用
- # 静态方法通过 @staticmethod 修饰
- @staticmethod
- def is_valid(a, b, c):
- return a + b> c and b + c> a and a + c> b
类方法
和静态方法比较类似, Python 还可以在类中定义类方法, 类方法的第一个参数约定名为 cls, 它代表的是当前类相关的信息的对象(类本身也是一个对象, 有的地方也称之为类的元数据对象)
- @classmethod
- def now(cls):
- ctime = localtime(time())
- return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec) # 相当与执行当前类的构造方法, 然后再返回
- ...
参数 cls 为默认参数, 表示当前类的对象
类和类之间的关系
简单的说, 类和类之间的关系有三种: is-a,has-a 和 use-a 关系.
is-a 关系也叫继承或泛化, 比如学生和人的关系, 手机和电子产品的关系都属于继承关系(用的较多).
has-a 关系通常称之为关联, 比如部门和员工的关系, 汽车和引擎的关系都属于关联关系; 关联关系如果是整体和部分的关联, 那么我们称之为聚合关系; 如果整体进一步负责了部分的生命周期(整体和部分是不可分割的, 同时同在也同时消亡), 那么这种就是最强的关联关系, 我们称之为合成关系.
use-a 关系通常称之为依赖, 比如司机有一个驾驶的行为 (方法), 其中(的参数) 使用到了汽车, 那么司机和汽车的关系就是依赖关系.
继承和多态
子类在继承了父类的方法后, 可以对父类已有的方法给出新的实现版本, 这个动作称之为方法重写(override). 通过方法重写我们可以让父类的同一个行为在子类中拥有不同的实现版本, 当我们调用这个经过子类重写的方法时, 不同的子类对象会表现出不同的行为, 这个就是多态(poly-morphism).
- class Student(Person): # 继承一般在类名之后的括号里写父类的名字
- # Person 为父类
- # 抽象方法用 @abstractmethod 标明
- @abstractmethod
- def make_voice(self):
- """发出声音"""
- pass
来源: http://www.bubuko.com/infodetail-3155715.html