首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我找不到为什么对象不能读取它自己的值

这个问题涉及到对象的访问控制和属性的读取。在大多数编程语言中,对象的属性可以通过对象的实例来访问和读取。然而,有些编程语言会限制对象直接读取自己的属性,而需要通过特定的方法或访问器来获取属性的值。

这种限制是为了保护对象的封装性和数据的安全性。通过封装对象的属性,可以控制对属性的访问和修改,从而确保数据的一致性和完整性。同时,通过提供访问器方法,可以对属性的读取进行额外的逻辑处理,例如数据验证、计算属性等。

在面向对象编程中,通常会使用封装的原则来隐藏对象的内部实现细节,只暴露必要的接口供外部使用。这样可以降低代码的耦合性,提高代码的可维护性和可扩展性。

对于无法直接读取自己值的对象,可以通过以下方式来获取属性的值:

  1. 使用公共方法或访问器:对象可以提供公共方法或访问器来获取属性的值。这些方法可以在对象内部访问属性,并返回属性的值给调用者。
  2. 间接访问:对象可以通过其他对象或中间层来获取属性的值。例如,可以通过一个控制器对象来获取另一个对象的属性值。
  3. 传递参数:对象可以接受参数,并根据参数的值返回相应的属性值。这样可以实现根据不同的条件返回不同的属性值。

总结起来,对象不能直接读取自己的值是为了保护对象的封装性和数据的安全性。通过提供公共方法、访问器或间接访问的方式,可以获取对象的属性值。这样可以确保对象的属性访问受到控制,并且可以在获取属性值时进行额外的逻辑处理。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动开发(移动推送、移动分析等):https://cloud.tencent.com/product/mobile
  • 腾讯云数据库(MySQL、MongoDB等):https://cloud.tencent.com/product/cdb
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云音视频处理(VOD、直播等):https://cloud.tencent.com/product/vod
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

map中对象虽然不能修改,但是可以替换

对象与指针对象 假设有一个 map 对象 map[string]Person , 其中 Person 定义如下。...是一个 struct type Person struct { Age int } 现在有一个需求, map 中 Person 对象年龄为 0 , 则将其默认设置为 18。...很显然, 由于 map[string]Person 中保存对象 ,因此通过任意方式获取都是 对象副本 , 所有修改都是在副本上, 不能 修改真实。...*Person 是 指针对象 , 获取到是 指针对象副本, 而 指针副本 也指向了原始数据, 就 可以修改 真实。...虽然不能被修改, 但是能被覆盖 然而, map 本身可以被 被认为 是一个指针对象。因此可以通过 同名 key 赋值覆盖方式, 实现 修改效果。

3K20

为什么写不出面向对象代码

” 那么上面的案例代码也有抽象,也有封装,为什么还是算面向过程思维呢。 那么什么是面向对象呢?...这里理解是: “ 万物皆可为对象 对象包含了自身属性与行为 功能交付其实是对象对象之间交互 ” 那么按照这样想法,上述代码中校验,三方系统推送,消息通知应该属于各自对象行为。...关于DDD领域驱动设计,推荐书籍: “《领域驱动设计:软件核心复杂性应对之道》 《实现领域驱动设计》 ” 为什么我们在使用贫血模型 看了上面的代码,我们可能会疑问:使用贫血模型开发挺好啊?...因此总结为什么人们更愿意使用贫血模型呢: “ 充血模型相对贫血模型存在一定设计难度,你需要多花时间思考哪些是对象本身行为 面向过程编程思想根深蒂固,很难改变 对代码没有太大负责态度,认为怎么简单怎么来...那么建议你多做一些思考: 1.代码是不是面向对象代码 2.代码设计是否遵循 高内聚,低耦合设计标准 3.代码是否遵循设计原则,如单一职责原则,开闭原则等 4. ...

1.2K20
  • 为什么要创建一个不能被实例化

    但如果有一天,你发现写了这样一个类: class People: def say(self): print(f'叫做:{self.name}') def __new...__(self): raise Exception('不能实例化这个类') kingname = People() kingname.say() 一旦初始化就会报错,如下图所示:...一个不能被初始化类,有什么用? 这就要引入我们今天讨论一种设计模式——混入(Mixins)。 Python 由于多继承原因,可能会出现钻石继承[1]又叫菱形继承。...显然,这样写会报错,因为两个类实例是不能比较大小: 但在现实生活中,当我们说 某人比另一个人大时,实际上是指某人年龄比另一人年龄大。...混入: 不能包含状态(实例变量)。 包含一个或多个非抽象方法。 参考资料 [1]钻石继承: https://en.wikipedia.org/wiki/Multiple_inheritance

    3.4K10

    IO流为什么必须手动关闭,不能像其他对象坐等GC回收?

    // 删除文件之前,先将 IO 流关闭 reader.close(); // 删除文件 file.delete(); 可能有的同学会发出疑问,为什么 IO 流必须手动关闭,不能像其他方法一样坐等...可能有的同学又发出疑问,平时本地测试时候没有发现这个问题,为什么部署到线上就出这个提示呢?...IO 流对象赋予给了out参数。...五、小结 本位主要围绕【为什么 IO 流必须手动关闭,不能像其他方法坐等 GC 处理】这个话题进行一次内容整合和总结,同时也给出了推荐正确关闭 IO 流写法。...六、参考 1、csdn - 演员12138 - IO流为什么必须手动关闭,不能像其他方法坐等GC处理 2、csdn - 思想永无止境 - Java之关闭流

    87430

    用编程模拟疫情传播来告诉你: 为什么现在你还不能出门

    看完视频你就明白为什么不能出门了,千万不要放松警惕!(@Ele实验室 ) 在家憋了一段时间的人们,耐心也在一点一点消磨中。很多人已经忍不住开始想蠢蠢欲动了。...他们总有一套自己理论:我们城市才一点确诊病人,而且在距离我们很远地方,就出去一会儿,哪有那么巧合,就感染上了。没事儿!大街上都没人,戴着口罩又没事。...疫情防控工作防控点或者是成功与否主要在于感染人员是否戴口罩、医院里隔离床位(或者是自我隔离位)、人口流动。...因此通过这一次疫情防控,为了你、、他,请以后感冒发烧生病之后,能够带个口罩,减少传染率。因为不知道你体内这一个病毒威力如何。 ?...因此一个疫情发生,必须依靠强大有力政府比如中国,和广大医院医生护士等伟大工作者们努力,所以平时请尽量尊重他们这个职业。 ?

    2.1K10

    为什么建议线上高并发量日志输出时候不能带有代码位置

    如果大家发现网上有抄袭本文章,欢迎举报,并且积极向这个 github 仓库 提交 issue,谢谢支持~ 本文是“为什么建议”系列第二篇,本系列中会针对一些在高并发场景下,对于组内后台开发一些开发建议以及开发规范要求进行说明和分析解读...往期回顾: 为什么建议在复杂但是性能关键表上所有查询都加上 force index 在业务一开始上线时候,我们线上日志级别是 INFO,并且在日志内容中输出了代码位置,格式例如: 2022-03...Java 9 之后,添加了新 StackWalker 接口,结合 Stream 接口来更优雅读取堆栈,即: 我们先来看看 new Exception().getStackTrace(); 底层是如何获取堆栈...模拟两种方式获取调用打印日志方法代码位置,与不获取代码位置会有多大性能差异 以下代码参考 Log4j2 官方代码单元测试,首先是模拟某一调用深度堆栈代码: 然后,编写测试代码,对比纯执行这个代码...由此,建议:对于微服务环境,尤其是响应式微服务环境,堆栈深度非常深,如果会输出大量日志的话,这个日志是不能带有代码位置,否则会造成严重性能衰减。

    1.4K20

    老梁聊C++,为什么不能修改set里?如果非要修改怎么办?

    作者 | 梁唐 大家好,是梁唐。 在上一期文章当中讲解了set一些常规用法和api,最后末尾时候留了一个问题,如何修改set中元素?今天就来聊聊这个问题。...不知道有没有小伙伴去尝试,可能有些小伙伴尝试了之后会说不对啊,在电脑上怎么能运行?...后者表示迭代器本身是一个常量,即迭代器本身指向位置不能修改。而前者表示迭代器指向位置是一个const常量,迭代器本身可以修改,指向不同位置,但我们不能修改它指向位置。...这里有必要说明一下,在C++当中const修饰符出现位置不同有不同含义。以指针举例,const T* p和T* const p是两种完全不同指针,前者表示不能通过指针去修改指向对象内容。...这也是为什么C++ Primer里强烈建议大家不要修改set中元素原因,如果真的要修改,只能先删除再添加了。虽然这样会牺牲一点点性能,但至少可以保证set里数据都是安全有序

    1.1K20

    详解Java构造方法为什么不能覆盖,钻牛角尖病又犯了....

    三 但是,看了输出,就纳闷为什么为什么第三行不是BigEgg2.Yolk(),不能覆盖吗?...那么,他们构造方法为什么不能覆盖,都是Public Yolk(){}。 当然,网上都说子类继承父类除构造方法以外所有方法,但这是结果,要知道为什么!! 五 先说几个错误观点 1....有说构造方法方法名与类名必须一样,父子类不能同名,故不能继,所以不能覆盖构造方法。 这个不用多说,这个例子,就是大神写出来打这样说的人。 2....(这就是为什么创建子类时先创建完父类原因了) 那么很明显了,要是同名类之间可以覆盖了,子类创建时就是创建了两个自己而没有父类。...Java设计时候,他们绝对想到有些人会像强迫症那样折腾个同名类继承,然后实现构造覆盖场景吧.... 总结 构造方法是唯一不能又造爸爸又造儿子

    2.1K20

    深度神经网络权初始化几种方式及为什么不能初始化为零(1)

    写在前面:该篇文章内容以及相关代码(代码在最后),都是亲自手敲出来,相关结论分析也是花了挺长时间做出来,如需转载该文章,请务必先联系,在后台留言即可。...一个好初始有以下优点: · 梯度下降收敛速度较快 · 深度神经中网络模型不易陷入梯度消失或梯度爆炸问题 该系列共两篇文章,我们主要讨论以下两个话题: 1、为什么在线性回归和逻辑回归中可以采用...0初始化,而在神经网络中不能采用(实际上不光是0初始化,将权初始化为任意相同,都很有可能使模型失效); 2、常用三种权初始化方法:随机初始化、Xavier initialization、He initialization...我们看一下使用权 0 初始化神经网络训练并测试该数据集结果: ?...测试结果 在100次迭代中,每一次迭代,损失都没有变化 模型检测准确度为11.35%,几乎完全没有检测出来 总结一下:在神经网络中,如果将权初始化为 0 ,或者其他统一常量,会导致后面的激活单元具有相同

    2.3K20

    【八股文Java】: Java对象hashCode()是可变吗?发生GC之后会变吗?为什么?hashCode如何生成?

    问:Java对象hashCode()是可变吗?发生GC之后会变吗?为什么?hashCode如何生成? 答:Java对象hashCode()默认实现是不可变,即使GC之后也不会变。...因为: 1、如果Java对象hashCode()方法重写即自定义hashCode实现,参与hash计算变量一旦被赋值后就不能再改变,hash与map容器相关,一旦改变,map取值:可能发生业务异常...2、默认Java对象hashCode()方式实现是native级别的,即JVM层实现,生成hashCode后会保存到对象对象头MarkWord中,即缓存在对象头MarkWord中,不会重复计算。...---- 附: 默认Java对象hashCode()方式实现跟踪源码(openjdk源码 版本jdk-jdk-21-ga): 1、寻找注册hashCodenative方法: (src/hotspot...: 上述找到ObjectSynchronizer::FastHashCode方法实现部分代码: HashCode生成方法: 可以看到HashCode生成有好几种策略,此openjdk默认策略时最后一种

    72830

    面试官:告诉为什么static和transient关键字修饰变量不能被序列化?

    一、写在开头在上一篇学习序列化文章中我们提出了这样一个问题:“如果在对象中,有些变量并不想被序列化应该怎么办呢?”...当时没有解释具体为什么static和transient 关键字修饰变量就不能被序列化了,这个问题实际上在很多大厂面试中都可能会被问及。我们今天在这篇中进行解释吧。...来说,在整个序列化过程中,它并未参与,原因是:我们在序列化与反序列化之间插入了属性重新赋值操作,最后输出中打印出是最新赋值,说明仅是调用了实例对象属性,而不是反序列化结果。...而这段源码就证明了,为什么对象序列化过程中,static和transient不会被序列化!...四、总结好啦,今天针对为什么static和transient关键字修饰变量不能被序列化进行了一个解释,下次大家在面试时候再被问道就可以这样回答啦,不过,还有的BT面试官会问transient关键字修饰变量真的不能被序列化吗

    16220

    为什么Iteratorremove方法可保证从源集合中安全地删除对象,而在迭代期间不能直接删除集合内元素

    这是为什么呢?...有些集合不允许在迭代时删除或添加元素,但是调用 Iterator remove() 方法是个安全做法。 那么为什么用Iterator删除时是安全呢?...现在我们回到最初问题,为什么用list直接删除元素迭代器会报错?...通过源码可以看出,在获取迭代器时,迭代器内expectedModCount被初始化为modCount,此时如果直接用ArrayList对象直接remove,那么就会改变modCount(进行了加一...Iterator 被创建之后会建立一个指向原来对象单链索引表,当原来对象数量发生变化时,这个索引表内容不会同步改变,所以当索引指针往后移动时候就找不到要迭代对象,所以按照 fail-fast

    5.8K31

    一篇文章带你了解JavaScript中变量,作用域和内存问题

    file 函数changeDa()作用域链包含两个对象它自己变量对象,和,全局环境 变量对象。...过程: daDa()函数局部环境,会先开始搜索自己变量对象变量和函数名,如果找不到,会向上搜索上一级作用域链。...对于changDa()中环境: 它包含两个对象::一为它自己变量对象,二为全局变量对象。 即它不能访问daDa()函数局部环境。...但是在调用这个函数时会返回为0,这是为什么呢?...file 延长作用域表现 ? file 什么是作用域链? 理解就是,根据在内部函数可以访问外部函数变量这种机制,用链式查找决定哪些数据能被内部函数访问。

    49710

    java如何实现封装_java如何实现封装

    大家好,又见面了,是你们朋友全栈君。 Java中类封装是如何实现封装是将对象信息隐藏在对象内部,禁止外部程序直接访问对象内部属性和方法。...初学的话,这个你只能从概念上理解,这就不多废话了,百度一下一大堆。 这个封装其实就是面向对象语言精髓,在这里一些都是对象,我们通过封装,只为用户提供接口。 Java中类封装是如何实现?...java中什么是类封装性 类封装性即不能让外面的类随意修改一个类成员变量; 在定义一个类成员,使用private关键字说明这个成员访问权限,只能被这个类其他成员方法调用,而不能被其他类中方法所调用...因为面向对象中所有的实体都是以对象为基本单位,以宏观世界实体来映射到计算机世界中,每个对象它自己属性和自己行为。 封装是把过程和数据包围起来,对数据访问只能通过已定义接口。...在Java面向对象编程当中为什么要封装?

    1.5K10

    彻底搞懂JS原型与原型链

    图片可以看到obj上确实多了一个sayHello属性,为一个函数,但是问题来了,obj上面并没有hasOwnProperty这个方法,为什么我们可以调用呢?这就引出了 原型。...当访问一个对象属性时,先在对象本身找,找不到就去对象原型上找,如果还是找不到,就去对象原型(原型也是对象,也有它自己原型)原型上找,如此继续,直到找到为止,或者查找到最顶层原型对象中也没有找到...OK,总结一下:原型存在意义就是组成原型链:引用类型皆对象,每个对象都有原型,原型也是对象,也有它自己原型,一层一层,组成原型链。...原型链存在意义就是继承:访问对象属性时,在对象本身找不到,就在原型链上一层一层找。说白了就是一个对象可以访问其他对象属性。...__proto__ // true上面说过,构造函数是为了创建特定类型对象,那如果想让Person这个构造函数创建对象都共享一个方法,总不能像下面这样吧:错误示范// 调用构造函数Person创建一个新对象

    1.9K20

    彻底弄懂JS原型与原型链

    图片可以看到obj上确实多了一个sayHello属性,为一个函数,但是问题来了,obj上面并没有hasOwnProperty这个方法,为什么我们可以调用呢?这就引出了 原型。...当访问一个对象属性时,先在对象本身找,找不到就去对象原型上找,如果还是找不到,就去对象原型(原型也是对象,也有它自己原型)原型上找,如此继续,直到找到为止,或者查找到最顶层原型对象中也没有找到...OK,总结一下:原型存在意义就是组成原型链:引用类型皆对象,每个对象都有原型,原型也是对象,也有它自己原型,一层一层,组成原型链。...原型链存在意义就是继承:访问对象属性时,在对象本身找不到,就在原型链上一层一层找。说白了就是一个对象可以访问其他对象属性。...__proto__ // true上面说过,构造函数是为了创建特定类型对象,那如果想让Person这个构造函数创建对象都共享一个方法,总不能像下面这样吧:错误示范// 调用构造函数Person创建一个新对象

    1.1K40

    理解JS 原型链

    如果还不明白,在打个比喻: 就像A街上有一间麦当劳,在B街上也开了一间麦当劳,它们都叫麦当劳,作用也是一样。但是你总不能说他们是一间麦当劳吧?...person1.sayName === person2.sayName;//false 如果这样的话,我们每构造出来一个对象,都要单独为这个对象创建出一个专属于它自己使用sayName,这是很占用内存...那我们能不能让所有的实例对象都共同使用一个sayName方法,来节省内存,提升效率呢?这需要我们先理解原型对象概念。 #原型对象 我们先了解原型对象概念。...有的,该属性为1 console.log(o.b); // 2 // o上有b这个属性吗?...因为它继承了Object.prototyoe上toString方法。 null 既然对象都会继承自Object.prototype上面的方法,那它自己原型又是什么呢。

    1.7K10

    Prototypal inheritance原型继承(实用篇)

    当我们想从对象读取一个property,但是该对象没有该property时,JavaScript会自动从该对象prototype中读取该property。...事实上,Prototype有2个限制: 引用不能形成环状。如果我们尝试给proto赋值,来形成环状结构,JavaScript会抛出错误。 proto要么是一个对象要么是null。没有其它。...虽然很明显,但是还是要说一下:一个对象只有一个prototype。一个对象不能同时从2个以上其它对象继承。...我们有2个仓鼠:speedy和lazy,它们都继承自通用仓鼠对象。 当我们喂它们中一个时,另外一个也会饱。为什么?怎样修改代码才能修正这个问题?...会被直接写入到this. 我们也可以通过给每个仓鼠新建一个它自己stomach,来避免问题出现。

    65430

    如何使用闭包进行一次降维打击?

    可以看到,直接运行outer()以后,返回是一个函数对象,我们需要再次运行这个函数对象,才能运行最里面的函数代码。...由于 Python 有作用域规定,所以在闭包里面是默认只能读取,但不能修改外层函数变量。我们来测试一下: ? 当你在闭包里面只有读,没有写时候,闭包可以正确读取外层变量值。...但是当你尝试给外层变量赋值时候,如果你在赋值语句上方尝试读取这个变量,就会报错。就像是没有定义变量一样。 并且,即使在赋值语句上方没有读取变量值操作,你赋值语句也不能修改外层函数变量。...在闭包中是另外创建一个同名变量而已,对它修改不能影响外层变量。 为了在闭包中修改外层变量,我们需要使用一个关键词:nonlocal,它可以获取上一层作用域。 我们来看一下: ?...大家注意,每一次获取值时候,都是直接运行fib(),不需要传入具体。也就是说,这个函数fib它自己知道自己当前运行到第几个值了。

    58630
    领券