使用内置函数dir
可以查看一个对象支持的所有属性和方法,Python中存在着很多的内置属性。
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 # 报错
表示类的描述信息。
class Foo: """ 描述类信息,这是用于看片的神奇 """ def func(self): pass print(Foo.__doc__) #输出:类的描述信息
__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 即:输出类
以字典的形式,显示对象所有的属性和方法。
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': '山西'}
这三个方法,是将对象当做字典一样进行操作。
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())