ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

写给小白的Python之面向对象-私有成员、property

2021-09-05 17:34:13  阅读:151  来源: 互联网

标签:__ name Python self xxx 面向对象 私有 property 属性


写给小白的Python之面向对象-私有成员、property

导读:

1.私有成员

2.@property

3.访问对象信息

1. 私有成员

在某些情况下,我们希望限制用户访问对象的属性或方法,也就是希望它是私有的,对外隐蔽。

那么,如何在类中定义私有属性或私有方法呢: 在属性名或方法名前加上两个下划线****__,使其不能在类的外部使用。最后,如果你的时间不是很紧张,并且又想快速的提高,最重要的是不怕吃苦,建议你可以联系维:762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

1.类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部通过self访问;

2.类的私有属性 和 私有方法,都不会被子类继承,子类也无法访问;

3.私有属性 和 私有方法 往往用来处理类的内部事情,不通过对象处理,避免数据在类的外部被修改,起到安全作用。

4. _x 单前置下划线,私有化属性或方法,在使用from xxx import *时都不会被导入,类对象和子类可以访问,但不要随便访问。_类名__x可以访问。

示例:

class A: __str = 'python' def __init__(self): self.__cook = "fire" def __f(self): 
return self.__str def f(self): 
return self.__stra = A()a.__str 
# 'A' object has no attribute '__str'a.__f() 
# 'A' object has no attribute '__f'a.f() 
# 输出: 
python

修改对象属性值

如果需要修改一个对象的属性值,通常有2种方法:

  • 对象名.属性名 = 数据 ----> 直接修改

  • 对象名.方法名() ----> 间接修改

私有属性不能直接访问,所以无法通过第一种方式修改,一般通过第二种方式修改私有属性的值:定义一个可以调用的公有方法,在这个公有方法内访问修改。最后,如果你的时间不是很紧张,并且又想快速的提高,最重要的是不怕吃苦,建议你可以联系维:762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

获取和修改私有属性

现代软件开发中,通常会定义**get_xxx()方法和set_xxx()**方法来获取和修改私有属性值。

# 返回私有属性的值def get_xxx(self): return self.__xxx
# 接收参数,修改私有属性的值def set_xxx(self, num): self.__xxx = num
# 可以通过访问公有方法set_xxx()来修改私有属性的值对象.set_xxx(100)
# 可以通过访问公有方法get_xxx()来获取私有属性的值print(对象.get_xxx())

写给小白的Python之面向对象-私有成员、property

2. @property

要调用那些私有属性怎么办?

可以使用property函数。 请看下面的例子:

__metaclass__ = typeclass ProtectMe: def __init__(self): 
self.me = "xiao" self.__name = "kivi" @property def name(self): return self.__name @name.setter def name(self, value):
 if len(name) > 10: 
print("name的长度太长了") self.__name = valueif __name__ == "__main__": p = ProtectMe() 
print(p.name) 
# kivi p.name = "salmond" print(p.name) 
# salmond
运行结果:kivisalmond

从上面可以看出, 用了@property之后, 再调用那个方法的时候, 用p.name的形式,就好像在调用以往非私有化属性一样。最后,如果你的时间不是很紧张,并且又想快速的提高,最重要的是不怕吃苦,建议你可以联系维:762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

把一个 getter 方法变成属性,只需要加上@property 就可以了,此时,@property 本身又创建了另一个装饰器@score.setter,负责把一个 setter 方法变成属性赋值,于是,我们就拥有一个可控的属性操作。至于装饰器,我们以后再讲。

3. 获取对象信息

type(obj)

使用 type(obj) 来获取对象的相应类型

>>> dog1 = Animal ( ’ dog1 ’ )>>> type ( dog1 )__main__. Animal

isinstance(obj, type)

使用isinstance(obj, type) 判断实例对象是否为指定的 type 类型的实例(类 classname 或其子类的实例)即object._class是 class_name 或其子类时返回 True。

>>> isinstance(object, class_name)True

issubclass(class1, class2)

issubclass(class1, class2):用于检查类 class1 是不是 class2 的子类。例如 issubclass(bool, int) 会返回 True,因为 bool 是 int 的子类。

hasattr/getattr/setattr

  • 使用 hasattr(obj, attr) 判断对象是否具有指定属性/方法;

  • 使用 getattr(obj, attr[, default]) 获取属性/方法的值, 要是没有对应的属性则返回 default 值(前提是设置了 default),否则会抛出 AttributeError 异常;

  • 使用 setattr(obj, attr, value) 设定该属性/方法的值,类似于 obj.attr=value。

dir(obj)

获取对象所有属性和方法名的列表。

标签:__,name,Python,self,xxx,面向对象,私有,property,属性
来源: https://blog.csdn.net/python_9988/article/details/120117988

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有