Python中私有方法和私有属性

1.私有方法和私有属性
私有方法只能在类内部被调用,不能被对象使用
私有属性只能在类内部使用,不能被对象使用

私有属性只能在类内部使用,对象不能使用,但是,我们可以通过在类内部定义公有方法对私有属性进行调用或修改,然后对象在调用这个公有方法使用。
###私有属性和私有方法########
#在属性名和方法名前面加上 __

class Person(object):
    def __init__(self):
        # 公有属性
        self.name = "李四"
        #私有属性
        self.__age = 18
    #定义公有方法
    def show_info(self):
        # 私有属性只能在类内部使用,可以通过内部公有方法修改,
        self.__age = 29
        print(self.name, self.__age)
#调用私有方法

#在类内部使用私有方法,可以通过内部公有方法调用
result = self.__show_address()
print( result)
#定义私有方法
def __show_address(self):
return "我的家在东北"

#定义对象,调用类

person = Person()
person.show_info()

#测试对象调用私有属性,结果报错,对象不能使用私有属性,私有属性只能在内部使用
#print(person.name, person.age)
#测试对象调用私有方法,结果报错,私有方法只能在类内部使用
#person.
show_address()
输出:

李四 29
我的家在东北

===================================================================
扩展:私有属性和私有方法,只是把名称进行了伪装,改成了其他名称,导致我们访问失败,
如果我们拿到了伪装后的名字,对象还是可以类外面调用私有方法和私有属性

Notice::python中的私有没有做到绝对私有(非常规方法)

#查看对象属性
dict (可以使用对象或者类,查看对象或者类属性)

通过print(person.dict)拿到对象person的属性名称

#查看对象属性和方法
dir (可以查看对象或者类属性和方法)

通过print(dir(person))查看到对象person的属性和方法名称

看到伪装后的方法和属性名称,对象就可以调用

2.子类继承父类,默认无法使用父类的私有方法和属性

====================
扩展:
但是,如果我们拿到父类私有属性和私有方法的名称,子类也可以调用

3.私有属性的修改

私有属性只能在类内部进行修改
通过定义公有方法修改,让后对象调用公有方法

=====================
扩展:
如果我们知道私有属性伪装后的名字,我们也可以通过伪装后的名字去修改私有属性,

我们在外面通过对象调用私有属性名称去修改的,不是真的修改,而是对对象添加了一个__开头的属性,并没有做到修改私有属性

总结:私有方法和私有属性只能在类内部使用,私有属性的修改也只能在类内部修改(非常规操作除外)

原文地址:http://blog.51cto.com/10412806/2088304

时间: 2024-12-11 06:05:26

Python中私有方法和私有属性的相关文章

python私有方法和私有属性属性理解

私有属性.方法--Python并没有真正的私有化支持,但可用下划线得到伪私有尽量避免定义以下划线开头的变量   (1)_xxx      "单下划线 " 开始的成员变量叫做保护变量,意思是只有类对象(即类实例)和子类对象自己能访问到这些变量,需通过类提供的接口进行访问:不能用'from module import *'导入   (2)__xxx    类中的私有变量/方法名 (Python的函数也是对象,所以成员方法称为成员变量也行得通.)," 双下划线 " 开始的

Objective-C的面向对象中,类有真正的私有方法和私有属性么?

在Java/C#等面向对象语言中,方法的访问权限可以通过public/private/protected来控制其访问权限.而在OC中,方法却并没有访问修饰符.那么,我们有没有办法使其方法变为私有? 1. 如果一个方法不在头文件中声明,那么这个方法在编译期,通过[receiver MethodName]的形式向对象发送消息,编译器会有警告,告诉你未找到该方法,但是实际运行时,依然可以正常运行 原因:编译时,即使这个方法不在头文件中声明,编译器仍然会将方法的签名编译进类的方法列表中, 发送消息时,会

coffeescript 继承、私有方法、私有属性、公共方法、公共属性、静态方法、静态属性实现

class Parent constructor: -> _privateAttr = 'privateAttr' _privateFun = ()-> console.log "Parent::privateFun log #{_privateAttr}" publicAttr: 'publicAttr' publicFun: ()-> _privateFun() console.log "Parent::publicFun log #{@publicAt

python 之简单聊聊私有方法和私有字段

# -*- coding: utf-8 -*- """ Created on Sun Nov 13 23:19:03 2016 @author: toby """ #知识点:私有方法和私有字段 ''' 应用场景: 不想被外部访问的东西,或者说不想暴露给外部的时候 那么就可以定义私有方法或私有字段 ''' class Province:     memo = 'One of China\'s 23 provinces' #静态字段         

如何调用封装的私有方法或私有对象

一般情况下,一个对象的私有方法或私有属性,是无法调用的,但在开发过程中,突然发现我们要钻牛角了,你不准调,但我一定要调 例前段时间,在项目中客户提出了能对报表的列进行顺序调整,并且同一台机子上不同的账号登录修改后的保存能独立,这个好解决应用微软的CacheManager能很好的解决,牛角来了....如果我要在项目中删除所有关于某个报表的记忆缓存咋办,可是只有一个公共的Remove(String Key)方法:问题是Key我用的是用户账号,我不想循环系统所有的账号去删除..... 在调试过程我发现

Python中strip方法的妙用

[开胃小菜] 当提到python中strip方法,想必凡接触过python的同行都知道它主要用来切除空格.有以下两种方法来实现. 方法一:用内置函数 #<python> if __name__ == '__main__': str = ' Hello world ' print '[%s]' %str.strip() #</python> 方法二:调用string模块中方法 #<python> import string if __name__ == '__main__

OC-私有方法和私有变量

以前没有太注意这个私有方法和私有变量,后来吃了很多亏, 今小总结一下: 1> 私有方法 概念:就是没有在.h文件中声明,只在.m文件实现的方法. 使用:私有方法只能在本类中使用,不能在子类和分类中使用. 2>私有变量 概念1:就是在.m文件中定义的变量 概念2:就是通过@property自动生成的私有成员变量; 使用:私有变量也是只能在本类中使用,分类和子类都不能使用. 3>声明为私有的变量 概念:声明为私有的变量,就是在.h文件中,定义的成员变量之前修饰符为@private. 使用:

Python中__init__方法

注意1.__init__并不相当于C#中的构造函数,执行它的时候,实例已构造出来了. 1 2 3 4 5 class A(object):     def __init__(self,name):         self.name=name     def getName(self):         return 'A '+self.name 当我们执行 1 a=A('hello') 时,可以理解为 1 2 a=object.__new__(A) A.__init__(a,'hello')

python 中特殊方法简写方式

##python 中特殊方法简写方式 class Test: __call__ = lambda *args: args[1] * 2 #这里需要注意lambda的参数 会默认将实例self 加进去 __str__ = lambda self: 'that`s useful...%s' % self.__class__.__name__ t = Test() print(t) print(t(10)) 原文地址:https://www.cnblogs.com/alplf123/p/1029388