python--面向对象与模块补充,反射

在python中,私有属性可以通过__(两个下划线定),实际上一个下划线也表示私有属性,不过还是可以访问到

关于私有属性、方法——Python并没有真正的私有化支持,但可用下划线得到伪私有,所以尽量避免定义以下划线开头的变量

"单下划线 " 开始的成员变量叫做保护变量,意思是只有类对象(即类实例)和子类对象自己能访问到这些变量,需通过类提供的接口进行访问;不能用'from module import *'导入,类似于php的protected受保护的,直接通过实例化对象和子类都可以访问

class People(object):

_test1 = "一个下划线的私有属性"

__test = '两个下划线的私有属性'

def __init__(self,name):

self.name = name

def run(self):

print("%s is running" %self.name)

p = People("Jack")

p.run()

print(p._test1)

" 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

class People(object):

_test1 = "一个下划线的私有属性"

__test = '两个下划线的私有属性'

def __init__(self,name):

self.name = name

def run(self):

print("%s is running" %self.name)

p = People("Jack")

p.run()

print(p._test1)

print(p.__test)

print(People.__test)

类名也是不能直接访问的:

其实这只是表象通过__dict__查看所以属性

print(People.__dict__)

其实python重新对双下划线的私有变量重新定义了,所以通过重新定义的名字可以直接访问即通过_类名__属性名访问

print(p._People__test)

可以直接访问

私有方法的访问:

正常是通过类内部提供的方法访问

私有的属性,不能通过对象直接访问,但是可以通过方法访问

私有的方法,不能通过对象直接访问

私有的属性、方法,不会被子类继承,也不能被访问

一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用

可以通过调用继承的父类的共有方法,间接的访问父类的私有方法、属性

对于封装,类本身就是一种封装,定义私有属性方法也属于一种封装,还有一种就是内部实现的逻辑,外部无法访问,只听提供一个接口供外调用。

反射:

python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

四个可以实现自省的函数

下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

执行:

m()

设置属性

#设置属性

setattr(p,'school',"qinghua")#等于p.school='qinghua'

print(p.school)

#修改也可以

setattr(p,'name',"lucy")

print(p.name)

删除:

setattr(p,'name',"lucy")

print(p.name)

delattr(p,"school")

delattr(p,"schools")#删除不存在的会报错

#print(p.school)

反射可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,意思是可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能,

导入其他模块,利用反射查找该模块是否存在某个方法

A文件。im2.py

class A():

#'A先定义,但是还没有实现具体的功能'

def __init__(self,addr):

print('定义好接口未实现')

self.addr=addr

B文件。demo.py

from im2 import A

a = A("china")

if hasattr(a,'get'):

func_get=getattr(a,'get')

func_get()

else:

print('---->不存在此方法')

print('处理其他的逻辑')

print("im2文件")

def test():

print("test")

def test1():

print("test1")

module_test = __import__('demo.im2')#获取文件名

print(module_test)

可以看出导入后会执行导入的文件

module_test = __import__('im2')

print(module_test)

module_test.test()#直接调用,如果是文件夹要写上包的名字例如im2.py在demo文件夹下,module_test.im2.test()

模块在导入的时候如果使用了,from module import * 那么私有方法不能被导入

会报错

如果改为直接调用可以运行,这说明python没有绝对的私有机制

双下划线也一样

原文发布于微信公众号 - 编程坑太多(idig88)

原文发表时间:2018-03-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python爬虫与数据挖掘

Python正则表达式初识(三)

前几天给大家分享了Python正则表达式基础(一)和Python正则表达式基础(二),感兴趣的小伙伴可以点击进去学习,今天继续给大家分享Python正则表达式基...

10830
来自专栏落花落雨不落叶

杭电2017

37380
来自专栏Python小屋

数学老师从没这么教过,乘法竖式中进位可以是多位(附Python实现与测试源码)

大概十五年前,曾经写过一个C语言版本的类似代码。核心思想是:在乘法竖式计算过程中,每次的进位实际上是可以超过一位的,虽然老师从来没有这么教过。 ? 这样的操作在...

35060
来自专栏漫漫深度学习路

python命名空间

python的命名空间 python使用命名空间记录变量。python中的命名空间就像是一个dict,key是变量的名字,value是变量的值。 python中...

22160
来自专栏Python小屋

Python运算符is与==的区别

在Python中,关系运算符==用来测试两个对象的值是否相等,而同一性测试运算符is用来测试两个对象是否是同一个对象,如果两个变量是同一个对象,那么它们的内存地...

23740
来自专栏magicsoar

C++编译与链接(0)-.h与.cpp中的定义与声明

C++中有的东西需要放在可以在.h文件中定义,有的东西则必须放在.cpp文件中定义,有的东西在不同的cpp文件中的名字可以一样,而有的则不能一样 那么究竟哪些东...

59570
来自专栏Python自动化测试

Python的元组学习(五)

本节来学习python的元组,在python语言中,元组的关键字是tuple同时元组是不可变的,列表与字典是可变的,元组的定义是一个(),下面通过代码...

11840
来自专栏Petrichor的专栏

python: map函数

对 sequence 中的 item 依次执行 function(item),将 执行结果 组成一个 List 返回。

28320
来自专栏深度学习之tensorflow实战篇

利用python内置函数,快速统计单词在文本中出现的次数

#coding=utf-8 import collections import os with open('str.txt') as file1:#打开文本...

42980
来自专栏C/C++基础

C++11 原生字符串

原生字符串(Raw String)指不进行转义“所见即所得”的字符串。很多编程语言早已支持原生字符串,如C#、Python、Shell等。C++作为一门高级程序...

20220

扫码关注云+社区

领取腾讯云代金券