• 注册
当前位置:1313e > 默认分类 >正文

oop编程中private关键词思考

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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: */

 

转载于:https://my.oschina.net/xiaopei/blog/855665

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录