2019独角兽企业重金招聘Python工程师标准>>>
oop好处
简单说一下oop的好处。
1,组件 - 数据和功能一起在运行着的计算机程序中形成的单元,组件在 OOP 计算机程序中是模块和结构化的基础。
2,抽象性 - 程序有能力忽略正在处理中信息的某些方面,也有我们平常说的面向接口编程。
3,封装 - 确保类或者对象不会以不可预期的方式改变其它组件的内部状态;只有在那些提供了内部状态改变方法的组件中,才可以访问其内部状态。
4,多态性 - 组件的引用和类集会涉及到其它许多不同类型的组件,而且引用组件所产生的结果得依据实际调用的类型。
5,继承性 - 允许在现存的组件基础上创建子类组件,这统一并增强了多态性和封装性。就是用类来对组件进行分组,而且还可以定义新类为现存的类的扩展,实现了动作的通用性。
然后有对其权限控制的几个关键词,public、protected、private等。
private关键词
习惯认为private的函数,在外面是不可访问的,常见的语言入如python,java,php。但是其实都是以有方法突破其private修饰的函数然后对其访问。所以private这个东西是一个语言层面的一个规范,或者是一个实现约束,不是必须是这个样子的。
下面列出主要语言实现的方法。
Python的调用私有方法比较奇怪,私有方法的是用双下划线开头“__”,其私有方法是“下划线+类名+私有方法”。php和java都是使用reflect来调用私有方法。
Python:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class Test(object):def __init__(self):passdef run(self):print "public function run"def __t(self):print "private function __t"if __name__ == "__main__":o = Test()o.run()//o.__t() //AttributeError: 'Test' object has no attribute '__t'o._Test__t()
java:
package com.mt.demo;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;/*** Created by ruimeng on 2017/3/8.*/
public class PrivateCall {public static void test(Object o) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {Class c = o.getClass();Method m = c.getDeclaredMethod("t2", null);m.setAccessible(true);m.invoke(o, null);}public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {Object o = new MyTest();test(o);}
}class MyTest {public static void t1() {System.out.println("public void t1");}private void t2() {System.out.println("private void t2");}
}
php:
obj = new MyClass();} /** * @brief getPrivateMethod * @param $name* @return method*/protected static function getPrivateMethod($name) {$refObj = new ReflectionClass(self::CLASS_NAME);$method = $refObj->getMethod($name);$method->setAccessible(true);return $method;} public function testPrivateFun() {$testCase = 'private function run';$testFunc = self::getPrivateMethod('run');$rs = $testFunc->invokeArgs($this->obj, array());var_dump($rs);$this->assertEquals($testCase, $rs);}
}/* vim: set expandtab ts=4 sw=4 sts=4 tw=100: */