导读:
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())
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)
获取对象所有属性和方法名的列表。