python 关于属性的理解与应用
2022/1/25 11:04:20
本文主要是介绍python 关于属性的理解与应用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、内置属性
使用内置函数dir
可以查看一个对象支持的所有属性和方法,Python中存在着很多的内置属性。
__slots__
Python中支持动态属性,可以直接通过点语法直接给一个对象添加属性,代码更加的灵活。但是在某些情况下,我们可能需要对属性进行控制,此时,就剋使用__slots__实现。
class Person(object): __slots__ = ('name', 'age') def __init__(self, name, age): self.name = name self.age = age p = Person('张三', 18) p.name = '李四' # 对象p只能设置name和age属性,不能再动态添加属性 # p.height = 180 # 报错
__doc__
表示类的描述信息。
class Foo: """ 描述类信息,这是用于看片的神奇 """ def func(self): pass print(Foo.__doc__) #输出:类的描述信息
__module__ 和 __class__
__module__ 表示当前操作的对象在那个模块;__class__ 表示当前操作的对象的类是什么。
test.py class Person(object): def __init__(self): self.name = 'laowang' main.py from test import Person obj = Person() print(obj.__module__) # 输出 test 即:输出模块 print(obj.__class__) # 输出 test.Person 即:输出类
__dict__
以字典的形式,显示对象所有的属性和方法。
class Province(object): country = 'China' def __init__(self, name, count): self.name = name self.count = count def func(self, *args, **kwargs): print('func') # 获取类的属性,即:类属性、方法、 print(Province.__dict__) # 输出:{'__dict__': <attribute '__dict__' of 'Province' objects>, '__module__': '__main__', 'country': 'China', '__doc__': None, '__weakref__': <attribute '__weakref__' of 'Province' objects>, 'func': <function Province.func at 0x101897950>, '__init__': <function Province.__init__ at 0x1018978c8>} obj1 = Province('山东', 10000) print(obj1.__dict__) # 获取 对象obj1 的属性 # 输出:{'count': 10000, 'name': '山东'} obj2 = Province('山西', 20000) print(obj2.__dict__) # 获取 对象obj1 的属性 # 输出:{'count': 20000, 'name': '山西'}
__getitem_、__setitem__和__delitem__方法
这三个方法,是将对象当做字典一样进行操作。
class Foo(object): def __getitem__(self, key): print('__getitem__', key) def __setitem__(self, key, value): print('__setitem__', key, value) def __delitem__(self, key): print('__delitem__', key) obj = Foo() result = obj['k1'] # 自动触发执行 __getitem__ obj['k2'] = 'laowang' # 自动触发执行 __setitem__ del obj['k1'] # 自动触发执行 __delitem__
二、实例属性、类属性
在面向对象开发中,使用类创建出来的实例是一个对象,那么,类是否是一个对象呢?
实例属性
通过类创建的对象被称为 实例对象,对象属性又称为实例属性,记录对象各自的数据,不同对象的同名实例属性,记录的数据各自独立,互不干扰。
class Person(object): def __init__(self,name,age): # 这里的name和age都属于是实例属性,每个实例在创建时,都有自己的属性 self.name = name self.age = age # 每创建一个对象,这个对象就有自己的name和age属性 p1 = Person('张三',18) p2 = Person("李四",20)
类属性
类属性就是类对象所拥有的属性,它被该类的所有实例对象所共有,类属性可以通过类对象或者实例对象访问。
class Dog: type = "狗" # 类属性 dog1 = Dog() dog2 = Dog() # 不管是dog1、dog2还是Dog类,都可以访问到type属性 print(Dog.type) # 结果:狗 print(dog1.type) # 结果:狗 print(dog2.type) # 结果:狗
使用场景:
- 类的实例记录的某项数据始终保持一致时,则定义类属性。
- 实例属性要求每个对象为其单独开辟一份内存空间来记录数据,而类属性为全类所共有 ,仅占用一份内存,更加节省内存空间。
注意点:
1、尽量避免类属性和实例属性同名。如果有同名实例属性,实例对象会优先访问实例属性。
class Dog(object): type = "狗" # 类属性 def __init__(self): self.type = "dog" # 对象属性 # 创建对象 dog1 = Dog() print(dog1.type) # 结果为 “dog” 类属性和实例属性同名,使用 实例对象 访问的是 实例属性
2、类属性只能通过类对象修改,不能通过实例对象修改
lass Dog(object): type = "狗" # 类属性 # 创建对象 dog1 = Dog() dog1.type = "dog" # 使用 实例对象 创建了对象属性type print(dog1.type) # 结果为 “dog” 类属性和实例属性同名,访问的是实例属性 print(Dog.type) # 结果为 "狗" 访问类属性 # 只有使用类名才能修改类属性 Dog.type = "土狗" print(Dog.type) # 土狗 dog2 = Dog() print(dog2.type) # 土狗
3、类属性也可以设置为私有,前边添加两个下划线。 如:
class Dog(object): count = 0 # 公有的类属性 __type = "狗" # 私有的类属性 print(Dog.count) # 正确 print(Dog.__type) # 错误,私有属性,外部无法访问。
三、私有属性和方法
在实际开发中,对象的某些属性或者方法可能只希望在对象的内部别使用,而不希望在外部被访问到,这时就可以定义私有属性和私有方法。
定义方法
在定义属性或方法时,在属性名或者方法名前增加两个下划线__
,定义的就是私有属性或方法。
class Person: def __init__(self,name,age): self.name = name self.age = age self.__money = 2000 # 使用 __ 修饰的属性,是私有属性 def __shopping(self, cost): self.__money -= cost # __money 只能在对象内部使用 print('还剩下%d元'%self.__money) def test(self): self.__shopping(200) # __shopping 方法也只能在对象内部使用 p = Person('张三',18) # print(p.__money) 这里会报错,不能直接访问对象内部的私有属性 p.test() # p.__shopping() 这里会报错,__shopping 只能在对象内部使用,外部无法访问
访问私有属性和方法
私有属性不能直接使用,私有方法不能直接调用。但是,通过一些代码,我们也可以在外部访问一个对象的私有属性和方法。
直接访问
使用方式:在私有属性名或方法名前添加 _类名
class Person: def __init__(self,name,age): self.name = name self.age = age self.__money = 2000 def __shopping(self, cost): self.__money -= cost p = Person('李四',20) print(p._Person__money) # 使用对象名._类名__私有属性名 可以直接访问对象的私有属性 p._Person__shopping(100) # 使用对象名._类名__函数名 可以直接调用对象的私有方法 print(p._Person__money)
注意:在开发中,强烈不建议使用 对象名._类名__私有属性名
的方式来访问对象的私有属性!
定义方法访问私有变量
在实际开发中,如果对象的变量使用了__
来修饰,就说明它是一个私有变量,不建议外部直接使用和修改。如果硬要修改这个属性,可以使用定义get
和set
方法这种方式来实现。
class Person: def __init__(self,name,age): self.name = name self.age = age self.__money = 2000 # __money 是私有变量,外部无法访问 def get_money(self): # 定义了get_money 方法,在这个方法里获取到 __money return self.__money # 内部可以访问 __money 变量 def set_money(self,money): # 定义了set_money 方法,在这个方法里,可以修改 __money self.__money = money p = Person('王五',21) # 外部通过调用 get_money 和 set_money 这两个公开方法获取和修改私有变量 print(p.get_money()) p.set_money(8000) print(p.get_money())
这篇关于python 关于属性的理解与应用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门
- 2024-11-14Python编程入门指南
- 2024-11-13Python基础教程
- 2024-11-12Python编程基础指南
- 2024-11-12Python基础编程教程
- 2024-11-08Python编程基础与实践示例
- 2024-11-07Python编程基础指南
- 2024-11-06Python编程基础入门指南
- 2024-11-06怎么使用python 计算两个GPS的距离功能-icode9专业技术文章分享