精华内容
下载资源
问答
  • python访问私有属性
    2017-02-19 21:11:17
    #coding:utf-8
    class Foo:
        def __init__(self,name):
            self.__name=name
        def f1(self):
            print(self.__name)
            
    class Bar(Foo):
        __cc="Good"
        def f2(self):
            print(self.__name)
        @staticmethod
        def f3():
            print(Bar.__cc)
            
    obj=Bar("Alex")
    obj.f1()
    Bar.f3()
    print(obj._Foo__name)#可以利用这个方法访问私有字段
    更多相关内容
  • 下面小编就为大家带来一篇python直接访问私有属性的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • python中如何访问私有属性

    千次阅读 2021-03-31 21:19:31
    我们已经知道了python属性私有化了之后其安全性增加了不少,但是在此时我们去访问私有属性就变得稍显繁琐。先说一下这个‘繁琐’的访问吧。 通过方法调用 这是一种抓住私有化可以从类的内部来访问而出现的一种...

    访问私有化属性的方法

    简单两笔记录一下今天的学习。
    我们已经知道了python中属性私有化了之后其安全性增加了不少,但是在此时我们去访问私有化属性就变得稍显繁琐。先说一下这个‘繁琐’的访问吧。

    通过方法调用

    这是一种抓住私有化可以从类的内部来访问而出现的一种方法,从类的内部开一条路让外部有机会来调用。
    形如:

    class Person:
        def __init__(self):
            self.__age = 18 #定义一个私有化属性
            pass
        def getage(self):
            return self.__age
        def setage(self,age):
            if age<0:
                print('age can not under 0')
                pass
            else:
                self.__age = age
                pass
            pass
    

    其中getage()和setage()两个函数就是供外界调用私有化属性的方法。
    你可以:

    p1 = Person()
    print(p1.getage)
    

    这样你可以访问到私有化的属性
    但是,很繁琐,就像你想和你心爱的女朋友聊天却不得不通过她的好闺蜜来传话一样,你不能直接触碰属性,而是要通过‘方法’来调用。
    别慌,python为你准备了其他的路径。

    方法一:property函数

    这个方法很easy,你只需要在原有的代码基础上加上一行简单的代码,便可以越过‘好闺蜜’,这样:

    class Person:
        def __init__(self):
            self.__age = 18 #定义一个私有化属性
            pass
        def getage(self):
            return self.__age
        def setage(self,age):
            if age<0:
                print('age can not under 0')
                pass
            else:
                self.__age = age
                pass
            pass
        #propert函数来实现直接访问私有属性
        age = property(getage,setage)
    

    最后一行的:age = property(getage,setage) 便是property函数的体现,有了它我们可以:

    p1 = Person()
    print(p1.age)
    

    看看输出:

    18
    

    ok!越过闺蜜了!
    这是属于函数的胜利,emm…还是调用了函数
    但是,或许我们可以再越过的舒服一点?

    方法二:装饰器

    给我们最开始的代码装上装饰器再稍加改动:

    class Person:
        def __init__(self):
            self.__age = 18 #定义一个私有化属性
            pass
        @property 
        def age(self):
            return self.__age
        @age.setter
        def age(self,age):
            if age<0:
                print('age can not under 0')
                pass
            else:
                self.__age = age
                pass
            pass
    

    然后看看调用:

    p1 = Person()
    print(p1.age)
    

    输出:

    18
    

    alright!我们做到了,与亲爱的她面对面接触!
    通过添加装饰器,使我们可以直接调用私有化的属性,这种方法在日常的场景中使用较多。上面的@property是给了我们调用私有化属性的权利,而@age.setter则给了我们修改私有化属性的权利。
    我们可以这样:

    print(p1.age)
    p1.age = 16
    print(p1.age)
    

    输出是这样的:

    18
    16
    

    简洁美丽,重返十六岁!
    使用方法:@property直接添加即可,@xxx.setter则是将事先设置好的修改方法的方法名加在setter前即可。

    小结

    访问私有化属性这里提供三种方法:
    1.内部方法调用
    2.property函数调用
    3.修饰器调用
    三种方法各有千秋,但是总得来看第三种是优于前两种的,因为其提供给了我们直接去访问属性的方法,避开了路上的曲折,使得效率更高。

    展开全文
  • Python没有类似于Java的private关键字, 但也可以为类定义私有属性. 只需将属性命名变为以__开头, 例如 __field. 示例代码: class Vector2D(object): def __init__(self, x, y): self.__x = float(x) self.__y = ...
  • Python默认的成员函数和成员变量都是公开的,类的私有属性指只有在类的内部使用的属性或方法,表现形式为以“__“ 属性名或方法名以双下划线开头。 class Test(object): __count = 0 # 私有属性 __count def get_...
  • 在本篇文章里小编给大家整理的是一篇关于python调用私有属性的方法总结,对此有需要的朋友们可以学习下。
  • 访问私有属性可以用这个方法,但在使用过程中需要频繁的调用自定义方法 比如说:想更改一次年龄时,就需要u1.set_age("年龄") #定义两个私有属性age,gender #1.get()方法-------定义对私有属性的get方法,获取私有...

    方法一:get , set 方法 。

    方法二:property方法

    方法三:通过装饰器@property


    1.在一个类中,写了__str__(self)方法和不写的区别

    class User(object):
        def __init__(self,name,age,gender):
            self.name = name
            self.age = age
            self.gender = gender
    
        def __str__(self):
            return "name = " + self.name
           
    
    u1 = User("张三","19","female")
    print(u1)
    >>>#打印结果
    name = 张三 
    
    class User(object):
        def __init__(self,name,age,gender):
            self.name = name
            self.age = age
            self.gender = gender
           
    
    u1 = User("张三","19","female")
    print(u1)
    >>>#打印结果
    <__main__.User object at 0x000001A55AB7E940>  #对象在内存里存的地址
    

    2.私有属性不能供外界访问,私有属性前有两个下划线如:__name、__age.....

    解决这一问题三个方法

    ①get( ) 和 set( )

    ②property 方法 (此方法需要借助于get、set方法)

    ③通过装饰器 装饰器:@property

    下面依次说明:

    class User(object):
        def __init__(self,name,age,gender):
            self.__name = name #此处的name、age、gender都是私有属性
            self.__age = age
            self.__gender = gender
    
        def __str__(self):
            return "name = " + self.__name
    
    u1 = User("张三","19","male")
    print(u1.__name) #私有属性不能供外界访问
    >>>
    发生异常:'User' object has no attribute '__name' 

    方法一:get , set 方法 。

    访问私有属性可以用这个方法,但在使用过程中需要频繁的调用自定义方法

    比如说:想更改一次年龄时,就需要u1.set_age("年龄")

    #定义两个私有属性age,gender
    #1.get()方法-------定义对私有属性的get方法,获取私有属性
    class User(object):
        def __init__(self,name,age,gender):
            self.name = name
            self.__age = age
            self.__gender = gender
    
        def __str__(self):
            return "我的姓名是:" + self.name + " , 我的年龄是:" + self.__age + " , 我的性别是:" + self.__gender
    
        def get_age(self):    
            return self.__age 
    
    u1 = User("张三","19","female")
    print(u1.get_age())
    >>>
    19
    
    #2.set()方法------定义对私有属性的重新赋值的set方法,重置私有属性
    class User(object):
        def __init__(self,name,age,gender):
            self.name = name
            self.__age = age
            self.__gender = gender
    
        def __str__(self):
            return "我的姓名是:" + self.name + " , 我的年龄是:" + self.__age + " , 我的性别是:" + self.__gender
    
        def set_age(self,age): #解决手段二 调用set方法,并更改属性值
            self.__age = age
    
    u1 = User("张三","19","female")
    u1.set_age("25")
    print(u1)
    >>>
    我的姓名是:张三 , 我的年龄是:25 , 我的性别是:female
    
    #get()和set()
    class User(object):
        def __init__(self,name,age,gender):
            self.name = name
            self.__age = age
            self.__gender = gender
    
        def __str__(self):
            return "我的姓名是:" + self.name + " , 我的年龄是:" + self.__age + " , 我的性别是:" + self.__gender
    
        def get_age(self):  
            return self.__age 
    
        def set_age(self,age):
            self.__age = age
    
    u1 = User("张三","19","female")
    print(u1.get_age())
    u1.set_age("25")
    print(u1)
    >>>
    19
    我的姓名是:张三 , 我的年龄是:25 , 我的性别是:female

    方法二:property方法

    property方法是对get , set 方法的封装。

    class User(object):
        def __init__(self,name,age,gender):
            self.__name = name #此处的name、age、gender都是私有属性
            self.__age = age
            self.__gender = gender
    
        def __str__(self):
            return "name = " + self.__name +", age = " + self.__age + ", gender = " + self.__gender
                        
        def get_name(self):
            return self.__name 
       
        def set_name(self,name):
            self.__name = name
    
        namer = property(get_name,set_name) #property里面放两个参数,get方法和set方法
    
    u1 = User("张三","19","male")
    print(u1.namer)       #要获取对象里的属性时,调property里的第一个参数即get方法
    u1.namer = "王五"     #要修改对象里的属性时,调property里的第二个参数即set方法
    print(u1)
    
    >>>
    张三
    name = 王五, age = 19, gender = male

    方法三:通过装饰器@property

    通过装饰器@property 在get方法上进行装饰,在@property下写的代码,跟写get方法意义一样。set方法通过 名称.setter来直接进行装饰(注意:名称要和@property下定义的方法名一致)

    class User(object):
        def __init__(self,name,age,gender):
            self.__name = name #此处的name、age、gender都是私有属性
            self.__age = age
            self.__gender = gender
    
        def __str__(self):
            return "name = " + self.__name + ", age = " + self.__age + " , gender = " + self.__gender
        #property下面默认跟的是get方法
        @property             
        def name(self): #1处
            return self.__name 
        #这里的@后跟的是 上面的函数名.setter
        @name.setter  
        def name(self,name):
            self.__name = name
    
    u1 = User("张三","19","male")
    #调用 对象.属性 时,自动触发执行@property修饰的name方法,默认执行get的方法 
    print(u1.name) 
    #调用 对象.属性 = xxx 时,自动触发执行@name.setter修饰的name方法
    u1.name = "lisa" 
    print(u1)
    
    >>>
    张三
    name = lisa, age = 19 , gender = male

    展开全文
  • Python私有属性是前面加两道下划线,然后在访问时就会报“object has no attribute 。。。”。事实上Python的这种私有属性只是一种规定,通过“_类名__属性名”还是可以读写的,如下例。 所以,Python似乎并没有...

    我们知道Python中私有属性是前面加两道下划线,然后在访问时就会报“object has no attribute 。。。”。事实上Python的这种私有属性只是一种规范,其实通过“_类名__属性名”还是可以读写的,如下。

    class Dog():
    
        def __init__(self, age: int):
            self.__age = age
            
    dog = Dog(8)
    print(dog.__age)#AttributeError: 'Dog' object has no attribute '__age'
    print(dog._Dog__age) #8
    #写也是类似的
    

    所以Python似乎并没有真正的私有属性,但不妨忘记这种流氓访问方式。

    再说@property,假如我们需要定义一个只读属性。写个getter方法可以实现,但如果想用访问属性的方式去读呢?这就可以用@property,如下。

    class Dog():
    
        def __init__(self, age: int):
            self.__age = age
    
        @property
        def age(self) -> int: return self.__age
        
    dog = Dog(8)
    print(dog.age)#可读不可写
    

    换句话说@property的作用就是把方法变成了一个属性。从property源码可以看到该类包含getter、setter、deleter三个方法。

    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
    

    @property所装饰的方法实现的是getter,另外我们可以在@property后面通过@xxx.setter、@xxx.deleter实现setter、deleter。比如,@age.setter可以以直接访问属性的方式修改属性,同时可以在修改时加入一些逻辑。

        @age.setter
        def age(self, age):
            if age < 0:
                raise Exception("age must be positive")
            self.__age = age
    

    至于Python中的@property、@xxx.setter相比java常用的getter、setter有什么优点,我想就是@property、@xxx.setter形式上不需要调用方法,直接通过属性来访问吧。

    展开全文
  • __name="私有属性" def func(self): print(C.__name) class sub_C(C): def info(self): print(C.__name)#派生类中不可以访问父类的私有字段 obj=C() obj.func() obj=sub_C() obj.info() 方法、属性的访问于上述...
  • python私有属性及方法

    2022-04-16 17:11:42
    私有权限:在属性名和方法名 前面 加上两个下划线 __ 类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部访问; 类的私有属性 和 私有方法,都不会被子类继承,子类也无法访问私有属性 和 ...
  • python私有属性和方法

    千次阅读 2021-10-07 17:05:21
    1、私有权限:在属性名和方法名 前面 加上两个下划线 __ 类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部访问; 类的私有属性 和 私有方法,都不会被子类继承,子类也无法访问私有属性 ...
  • 私有属性和私有方法
  • _age #赋值和输出,不会报错,结果为18 i.print_age() #class内部方法输出__age为20 按照道理来说1,2行是不该是这样的,私有属性是无法在外部访问的,而在这里居然可以赋值后访问。而第三行表明,对于实例 i ,有...
  • 类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部访问; 类的私有属性 和 私有方法,都不会被子类继承,子类也无法访问私有属性 和 私有方法 往往用来处理类的内部事情,不通过对象...
  • Python中的私有属性和私有方法
  • def __init__(self, name): self.name = name ...@property # 获取私有属性 def money(self): return self.__money @money.setter # 功能1.动态设置属性值 功能2.验证数据合法性 def money(self,...
  • 我们知道在python语法中,给属性和方法添加私有是在属性或方法前面加__ 然后我们就无法通过正常方式访问属性和方法,如下图所示: class Persson: def __init__(self, name): self.name = name self.__age = ...
  • 本文实例讲述了Python 类的私有属性和私有方法。分享给大家供大家参考,具体如下: xx:公有变量 _xx:公有变量或方法,不能通过import导入其他模块(只有模块内部使用)。类对象和子类可以访问 __xx:私有变量或方法(伪...
  • 1、 场景定义 私有属性 是指在 Python 的面向对象开发过程中,对象的某些属性只想在对象的内部被使用,但不想在外部被访问...在 Python 中定义私有属性和私有方法的语法如下: class Staff: def __init__(self, s_nam.
  • 1. 场景定义私有属性是指在 Python 的面向对象开发过程中,对象的某些属性只想在对象的内部被使用,但不想在外部被访问到这些属性。即:私有属性是对象不愿意公开的属性。私有方法是指在 Python 的面向对象开发过程...
  • 主要介绍了Python私有属性私有方法应用场景解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 将给大家介绍什么是私有属性和私有方法,科普一下伪私有属性和私有方法,包括如何访问。 1.私有属性和私有方法 什么是私有? 对象的某些属性或者方法,只希望在对象的内部被使用,而不希望在外部被访问 通过...
  • Python私有属性总结

    2020-08-02 20:49:08
    前言:在前面的博文里,我介绍了Python中的面向对象,详情见:深入浅出Python——Python高级语法之文件操作,本文将主要讲解with open() as读写文件的优点与作用。
  • python---私有属性

    2022-04-17 19:03:23
    私有权限 封装的意义: ...类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部访问; 类的私有属性 和 私有方法,都不会被子类继承,子类也无法访问私有属性 和 私有...
  • 注意,不能直接访问私有属性,但可以通过方法中访问。 举个栗子: class A: __name='class A' def dd(self): print('私有属性') sg=A() sg.dd() print(sg.__name) 运行结果: Traceback (most recent call last...
  • 首先我们定义一个包含私有属性的类 ...实例化并尝试访问__private私有属性, private_out = Foo() private_out.__private 结果如下, Traceback (most recent call last): File “&amp;lt;pyshell#140...
  • # python中没有真正意义上的私有 class Women: def __init__(self, name): self.name = name self.__age = 18 # 私有属性(__属性... # 对象方法内部,可以访问对象的私有属性 print("%s的年龄是%d" % (self.name

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,384
精华内容 16,953
关键字:

python访问私有属性