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

Python类中的属性

它建议类的用户不要访问私有方法和属性——但用户可以随意这样做,而且更重要的是,他们不需要付出太多的努力。 在本文中,我将用简单的话和简单的例子来解释这些事情。...当我想到私有属性时,我将其想象为一个在类外部看不到和使用的属性。同样,它是一个可以被看到和使用的公共属性。...你可以将属性标记为私有,并相信没有人会在类外部使用该属性。指示方法基于信任:我们相信类的用户不会使用其私有属性。该方法除此之外没有其他保护措施。 指示方法基于信任:我们相信类的用户不会使用其私有属性。...它们并不真正隐藏,因为dir()函数会显示类的所有属性,包括公共和私有属性,但后者的名称已经改变。 ---- 感谢阅读本文。我希望在Python类的上下文中,隐私不再成为你的问题。...脚注 ¹ 请记住,在Python中,方法是类的属性。因此,每当我提到属性的隐私性时,我指的是包括方法在内的属性的隐私性。 ² 名称改编有两个目的: 它提高了类的私有属性和方法的保护级别。

18130

Effective Java(第三版)——条目十六:在公共类中使用访问方法而不是公共属性

如果一个公共类暴露其数据属性,那么以后更改其表示形式基本上没有可能,因为客户端代码可以散布在很多地方。...但是,如果一个类是包级私有的,或者是一个私有的内部类,那么暴露它的数据属性就没有什么本质上的错误——假设它们提供足够描述该类提供的抽象。...如果类的内部表示是可取的,可以在不触碰包外的任何代码的情况下进行更改。 在私有内部类的情况下,更改作用范围进一步限制在封闭类中。 Java平台类库中的几个类违反了公共类不应直接暴露属性的建议。...当一个属性是只读的时候,除了更改类的API外,你不能改变类的内部表示形式,也不能采取一些辅助的行为,但是可以加强不变性。...4.什么是Java线程转储(Thread Dump),如何得到它? 5.为什么Thread类的sleep()和yield()方法是静态的?

84410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Getter & Setter:使用还是废弃

    私有变量 为什么我们要使用私有的实例变量呢? 因为我们不希望其他类直接的依赖于这些变量。而且在心血来潮时,我们还可以灵活的修改变量类型和实现。...存取方法 存取方法(又被称为getters和setters)是一些可以用来读写对象实例变量值的方法。 为什么使用存取方法? 在类中使用存取方法而非直接暴露属性是有理由的。...如果一个类是包级私有或是私有嵌套类可见,假设它的属性字段很好的描述了类所提供的数据,那么对外暴露这些属性字段本质上是没有问题的。 这样的类被限制在类所声明的包内,同时调用代码受限于类内部表示。...我们可以修改这个类,而不用改变任何包外的代码。而且,对于私有嵌套类,改动的范围进一步的被缩小到被嵌套类里。 使用公共属性的另一个例子是JavaSpace 请求对象。...但是我们不是非常虔诚的那些人。制定规则是有理由的。对于私有属性规则的理由并不适用于这个特例。这是一个特殊的例外,我也告诉人们不要在他们的类中使用公共属性,但也存在例外。

    1.3K60

    Python教程第6章 | Python面向对象

    fun1 我是 fun2 我是 fun3 三、类方法 1、类方法如何调用类属性 通过上面我们已经会定义类了,那么这里讲一下在同一个类里,类方法如何调用类属性的。...除此之外,在这里,还要强调一个概念,当你把类实例化之后,里面的属性和方法,就不叫类属性和类方法了,改为叫实例属性和实例方法,也可以叫对象属性和对象方法。 为什么要这样强调呢?...九、类的访问控制 1、类属性的访问控制 在 Java 中,有 public (公共)属性 和 private (私有)属性,这可以对属性进行访问控制。...在类内部的方法中使用时 self.__private_attrs。 为什么只能说一般情况下呢? 因为实际上, Python 中是没有提供私有属性等功能的。...但是 Python 对属性的访问控制是靠程序员自觉的。为什么这么说呢? 看看下面的示例: 仔细看图片,为什么说双下划线不是真正的私有属性呢?

    21310

    Python之面向对象三

    私有变量和私有方法 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) #其实这仅仅是一种变形操作 #类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式: class...A: __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N def __init__(self): self...私有方法 3.在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的 #正常情况 >>> class A: ... def fa(self): ......是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解) 成人的BMI数值: 过轻...''' 为什么要用property 将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的, 这种特性的使用方式遵循了统一访问的原则

    824100

    ECMAScript 2022(ES13)初体验

    undefined 为什么 res 可以正常输出,而 num 不行?...Error: 我的错误信息 // 第三种输出:错误原因: err 正则表达式匹配索引 给正则表达式添加修饰符 d,会生成匹配对象,记录每个组捕获的开始和结束索引,由于 /d 标识的存在,m1 还有一个属性...默认情况下,class 中所有属性都是公共的,可以在 class 之外进行修改,例如 class myClass { count = 1 setCount = () => { this.count...,当我们直接设置 count 属性的时候,是直接跳过 setCount 进行设置的,有时候我们并不想这样,所以可以使用私有实例字段,用法很简单,只需要在私有字段添加 # 就可以实现,当然了,在调用的时候我们也应该加上...该规范就提供了一种在类声明/定义期间评估静态初始化代码块的优雅方法,可以访问类的私有字段。

    1.1K20

    java中关于set()和get()方法的理解和使用

    参考链接: Java中的实例变量隐藏 java中 当定义了一个私有的成员变量的时候,如果需要访问或者获取这个变量的时候,就可以编写set或者get方法去调用。 ...属性的真实作用不只是为了更改某个成员变量的值比如form的size属性在set的同时要重画form,如果你不想让用户对color修改,就不要提供set方法 是面向对象具有的set and get它的用途...; } get { return b; }}除去这个属性之外的地方根本不需要改变 通过上面的讲解。...满足一定条件让GET和SET来改变类中的私有变量,而不能让实例直接操作。像上面的代码保证了color属性的安全性。...既然如此可不可以写成set{color=value*20; //value是不是相当于Color的值} 我当初和你有一样的想法.但是现在改变了。举个例子说明一下吧.

    3.9K30

    JAVA不可变类(immutable)机制与String的不可变性

    可变类:相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。 二、不可变类的优点 说完可变类和不可变类的区别,我们需要进一步了解为什么要有不可变类?...ImmutableDemo之外通过修改array对象的值来改变myArray内部的值。...为了保证内部的值不被修改,可以采用深度copy来创建一个新内存保存传入的值。...因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。...这种特性使得不可变类提供了线程安全的特性但同时也带来了对象创建的开销,每更改一个属性都是重新创建一个新的对象。JDK内部也提供了很多不可变类如Integer、Double、String等。

    1.7K20

    Java 中的 String 为什么是不可变的?

    众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。...除此之外还有一个hash成员变量,是该String对象的哈希值的缓存,这个成员变量也和本文的讨论无关。在Java中,数组也是对象。 所以value也只是一个引用,它指向一个真正的数组对象。...至少在我们自己写的普通代码中不能够做到,因为我们根本不能够访问到这个value引用,更不能通过这个引用去修改数组。 那么用什么方式可以访问私有成员呢?...没错,用反射, 可以反射出String对象中的value属性, 进而改变通过获得的value引用改变数组的结构。...我有一个微信公众号,经常会分享一些Java技术相关的干货。如果你喜欢我的分享,可以用微信搜索“Java团长”或者“javatuanzhang”关注。

    1.8K01

    如何通俗的理解面向对象编程

    然后我将解释为什么类在各种情况下都很重要,以及它们是如何解决一些基本问题的。这样,读者也能在帖子末尾理解这三大术语。...除此之外,我们中的许多人最终都会在没有意识到的情况下使用类和对象。例如,当你使用任何scikit-learn模型时,实际上是在使用一个类。...假设你在一家有很多账户的银行工作。我们可以创建一个名为account的类,用于处理任何帐户。例如,下面我创建了一个基本的玩具类帐户,它为用户存储数据,即帐户名和余额。...更多信息 为什么我们看到函数名或属性名以单下划线和双下划线开头?有时我们想让类中的属性和函数私有化,而不允许用户看到它们。这是封装的一部分,我们希望“限制对对象某些组件的直接访问”。...因此,当我们以下面的方式创建iPhone类时,你将无法访问你的memory或ipython私有函数,因为该属性现在使用_。 ? 但你仍然可以使用(尽管不建议使用)更改变量值, ?

    1.3K20

    STRING对象不可变的原理

    众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢?可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。...除此之外还有一个hash成员变量,是该String对象的哈希值的缓存,这个成员变量也和本文的讨论无关。在Java中,数组也是对象(可以参考我之前的文章 java中数组的特性)。...至少在我们自己写的普通代码中不能够做到,因为我们根本不能够访问到这个value引用,更不能通过这个引用去修改数组。 那么用什么方式可以访问私有成员呢?...没错,用反射, 可以反射出String对象中的value属性, 进而改变通过获得的value引用改变数组的结构。...例如一个Car对象,它组合了一个Wheel对象,虽然这个Wheel对象声明成了private final 的,但是这个Wheel对象内部的状态可以改变, 那么就不能很好的保证Car对象不可变。

    72240

    TypeScript 官方手册翻译计划【十二】:类

    如果你坚持要使用除了构造器之外的方法(比如使用一个外部库填充类的内容)去初始化一个字段,那么你可以使用确定赋值断言运算符 !...— 它返回的类型始终是类实例的类型 super 调用 和 JavaScript 一样,如果你有一个基类和一个派生类,那么在派生类中使用 this....注意事项 有个要点需要理解,那就是 implements 子句只是用于检查类是否可以被视为某个接口类型,它完全不会改变类的类型或者它的方法。...成员可见性 你可以使用 TypeScript 控制特定的方法或属性是否在类的外面可见。 public 类成员的默认可见性是公有的(public)。...关于 C# 为什么会认为这段代码是不合法的,可以阅读这篇文章了解更多信息:为什么我无法在一个派生类中去访问一个受保护成员?

    2.6K10

    String 的不可变真的是因为 final 吗?

    String 不可变的表现就是当我们试图对一个已有的对象 "abcd" 赋值为 "abcde",String 会新创建一个对象: ? String 为什么不可变?...那既然我们说 String 是不可变的,那显然仅仅靠 final 是远远不够的: 1)首先,char 数组是 private 的,并且 String 类没有对外提供修改这个数组的方法,所以它初始化之后外界没有有效的手段去改变它...你可以随便翻个源码看看来验证这个说法,比如 substring 方法: ? 为什么要设计成不可变的呢? 1)首先,字符串常量池的需要。...为此,JVM 为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化: 为字符串开辟了一个字符串常量池 String Pool,可以理解为缓存区 创建字符串常量时,首先检查字符串常量池中是否存在该字符串...想要改变 String 无非就是改变 char 数组 value 的内容,而 value 是私有属性,那么在 Java 中有没有某种手段可以访问类的私有属性呢?

    58830

    Python 3 学习笔记:面向对象编程

    创建类的实例 定义好一个类,并不能供我们直接使用,而是需要创建一个它的实例之后,才可以使用其内部的属性和行为。...但是如果想在创建类的实例的时候,为它的属性赋予一些参数,就需要自定义一个 init() 方法。 该方法用于在创建类的实例时,传入必要的属性。...属性 属性指类中的变量,包括类的属性和实例属性,它们定义的位置不同。 类的属性 类的属性定义在类中(实例方法之外),所有类的实例都可以访问类的属性。...类的属性不仅仅只能在定义类的时候定义,也可以在类的定义之外动态添加, class Triangle: triangle_amount = 0 def __init__(self, base, height...访问限制 可以在类的外部访问创建类的时候定义的属性和方法,如果我们不想某些属性或方法在类的外部被直接访问(使用),可以给它们加上限制。

    52730

    Java 可变对象和不可变对象

    (3)不要提供任何可以修改对象状态的方法 - 不仅仅是set方法, 还有任何其它可以改变状态的方法 (4)如果类有任何可变对象属性, 那么当它们在类和类的调用者间传递的时候必须被保护性拷贝     代码...* (在其它情况下, 允许在原生类外部改变一个属性是很有意义的;      * 这种情况就是当属性作为其它地方创建的一个对象引用)      */     private final...这通常很危险,因为Date对象既可以 // * 被这个类改变也可以被它的调用者改变.即,类不再对fDate拥有绝对的控制。...     *      * 返回属性的一个保护性拷贝.调用者可以任意改变返回的Date对象,但是不会      * 影响类的内部.为什么?...在《Effective Java》一书中, Joshua Bloch提出了一个强制性的建议 :      "类应该是不可变的,除非有很好的理由让它是可变的....如果一个类不能设计为不可变的,也要尽可能的限制它的可变性

    1.9K20

    Java中的String为什么是不可变的?

    众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。...除此之外还有一个hash成员变量,是该String对象的哈希值的缓存,这个成员变量也和本文的讨论无关。在Java中,数组也是对象。 所以value也只是一个引用,它指向一个真正的数组对象。...至少在我们自己写的普通代码中不能够做到,因为我们根本不能够访问到这个value引用,更不能通过这个引用去修改数组。 那么用什么方式可以访问私有成员呢?...没错,用反射, 可以反射出String对象中的value属性, 进而改变通过获得的value引用改变数组的结构。...例如一个Car对象,它组合了一个Wheel对象,虽然这个Wheel对象声明成了private final 的,但是这个Wheel对象内部的状态可以改变, 那么就不能很好的保证Car对象不可变。

    70330

    Java-不可变类的实现

    可变类: 相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。 二、不可变类的优点 说完可变类和不可变类的区别,我们需要进一步了解为什么要有不可变类?...ImmutableDemo之外通过修改array对象的值来改变myArray内部的值。...为了保证内部的值不被修改,可以采用深度copy来创建一个新内存保存传入的值。...因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。...这种特性使得不可变类提供了线程安全的特性但同时也带来了对象创建的开销,每更改一个属性都是重新创建一个新的对象。JDK内部也提供了很多不可变类如Integer、Double、String等。

    1.3K10

    Python中的高阶概念属性:五个你应该搞明白的知识点

    在Python中,这些对象绑定的特征数据通常称为属性。在本文中,我将特别在自定义类的上下文中讨论它们 01 类属性 为了更好地管理项目中的数据,我们经常需要创建自定义类。...实例对象仍然可以像以前一样访问它的其他属性(例如,名称)。然而,实例不能访问私有属性剩余的标记,这可能是我们所期望的。实际上,这种对访问这些属性的限制正是它们被称为“私有”属性的原因。...但它是怎么发生的,在引擎盖下?毕竟,我前面提到过,所有Python属性在默认情况下都是公共的。下面将向您展示Python如何实现“私有”属性。 >>> dog....但是,如果我们确实想检索任何私有属性,我们仍然可以使用被破坏的名称访问它,就像我们在代码片段中使用_dog__标记所做的那样。 05 受保护的属性 在上一节中,我们讨论了私有属性,但是受保护的属性呢?...不像双下划线会导致混乱,单下划线前缀不会改变Python解释器处理这些属性的方式——它只是Python编程世界的一个惯例,表示他们(例如,编码器)不希望你访问这些属性。

    78221

    String类不可变分析以及普通不可变类

    一、String为什么不可变? 要了解String类创建的实例为什么不可变,首先要知道final关键字的作用:final的意思是“最终,最后”。 final关键字可以修饰类、方法、字段。...修饰类时,这个类不可以被继承; 修饰方法时,这个方法就不可以被覆盖(重写),在JVM中也就只有一个版本的方法--实方法; 修饰字段时,这个字段就是一个常量。...没错,用反射,可以反射出String对象中的value属性, 进而改变通过获得的value引用改变数组的结构。...例如一个Car对象,它组合了一个Wheel对象,虽然这个Wheel对象声明成了private final 的,但是这个Wheel对象内部的状态可以改变, 那么就不能很好的保证Car对象不可变。...③不仅可以共享不可变对象,甚至也可以共享它们的内部信息。 ④不可变对象为其他对象提供了大量的构件。如果知道一个复杂对象内部的组件不会改变,要维护它的不变性约束是比较容易的。

    63830

    C++自定义类的对象对于其私有变量的访问

    “在C++的类的作用域内,可以对其私有成员变量进行操作” 以下语法规则是不言自明的: 在自定义类A的成员函数中,可以对该类的私有成员变量进行赋值等操作,但是在类定义之外所声明的A类的对象aobj是不可以直接访问...A类的私有变量的,只有通过在A类的成员函数中开放访问其私有变量的接口,对象aobj才可以对私有变量进行操作。...在开发一个类的过程中,我做了如下的定义 A类 class A { private: int m_para; public: void Func(); } void A::Func()...:为什么我可以直接操作一个临时对象的私有变量?...这个看似不是问题的问题困扰了我几天,最后对这一问题的解答也就是开篇的第一句话———— 在C++的类的作用域内,可以对其私有成员变量进行操作 关键就在于对“类作用域”的理解。

    1.5K10
    领券