Python 类与对象编程详解三(类属性、实例属性),属性,方法,实例,操作,类属
Python 类与对象编程详解三(类属性、实例属性)
易采站长站,站长之家为您整理了Python 类与对象编程详解三(类属性、实例属性)的相关内容。
上一篇:Python 类与对象编程详解二(成员保护和访问限制)
目录类属性属性的定义操作类属性的三种方法属性存在的意义操作类属性的方法使用@property装饰器操作类属性通过@property装饰器对属性的取值和赋值加以控制使用python内置函数操作属性。
类属性
属性的定义
python中的属性其实是普通方法的衍生。
操作类属性的三种方法
1.使用@property装饰器操作类属性。
2.使用类或实例直接操作类属性(例如:obj.name,obj.age=18,del obj.age)
3.使用python内置函数操作属性。
属性存在的意义
1、访问属性时可以制造出和访问字段完全相同的假象,属性由方法衍生而来,如果Python中没有属性,方法完全可以代替其功能。
2、定义属性可以动态获取某个属性值,属性值由属性对应的方式实现,应用更灵活。
3、可以制定自己的属性规则,用于防止他人随意修改属性值。
操作类属性的方法
使用@property装饰器操作类属性
定义时,在普通方法的基础上添加@property装饰器;属性仅有一个self参数,调用时无需括号;
优点:
1) @property装饰器可以实现其他语言所拥有的getter,setter和deleter的功能(例如实现获取,设置,删除隐藏的属性)
2) 通过@property装饰器可以对属性的取值和赋值加以控制,提高代码的稳定性。
实例:
class Goods(): #定义类
@property
def price(self): #查看属性值
print('@property')
@price.setter
def price(self,value):
print('@price.setter')
@price.deleter
def price(self):
print('@price.deleter')
obj = Goods()
obj.price #自动执行@property修饰的price方法,并获取方法的返回值
obj.price = 2000 #自动执行price.setter 修饰的 price 方法,并将2000赋值给方法的参数
del obj.price # 自动执行 @price.deleter 修饰的 price 方法
运行结果:
@property
@price.setter
@price.deleter
通过@property装饰器对属性的取值和赋值加以控制
实例2:
class Goods():#定义类
def __init__(self):
self.value = 50
@property
def price(self): #查看属性值
return self.value
@price.setter
def price(self,value):
self.value = value
print("value = ",value)
@price.deleter
def price(self):
del self.value
print("属性值删除成功")
obj = Goods()
print(obj.price) #自动执行@property修饰的price方法,并获取方法的返回值
obj.price = 2000 #自动执行price.setter 修饰的 price 方法,并将2000赋值给方法的参数
del obj.price # 自动执行 @price.deleter 修饰的 price 方法
print(obj.value)
运行结果:
AttributeError: 'Goods' object has no attribute 'value'
50
value = 2000
属性值删除成功
2、实用类或者实例直接操作类属性
缺点:对类的属性没有操作控制规则,容易被人修改。
class Employee (object):
#所有员工基类
empCount = 0
def __init__(self, name, salary) :
#类的构造函数
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self) :
#类方法
print ("total employee ",Employee.empCount)
def displayEmployee(self) :
print ("name :",self.name , ", salary :", self.salary)
#创建Employee类的实例对象
emp1 = Employee("丽丽", 10000)
emp1.displayCount()
emp1.displayEmployee()
emp1.salary = 20000 #修改属性 salary
print (emp1.salary)
emp1.age = 25 #添加属性 age
print (emp1.age)
del emp1.age #删除 age属性
emp1.empCount=100
Employee.empCount=1000
运行结果:
total employee 1
name : 丽丽 , salary : 10000
20000
25
使用python内置函数操作属性。
下面的实例需要用到反射,如果不是很了解,请看这篇文章
Python 反射详解
实例3:
# encoding=utf-8
class Employee(object):
# 所有员工基类
empCount = 0
def __init__(self, name, age, salary):
# 类的构造函数
self.name = name
self.salary = salary
self.age = age
Employee.empCount += 1
def displayCount(self):
# 类方法
print("total employee", Employee.empCount)
def displayEmployee(self):
print("name:", self.name, "age:", self.age, ",salary:", self.salary)
# 创建Employee类的实例对象
emp1 = Employee("Rose", 27, 20000)
# 判断实例对象是否存在某个属性,存在返回True,否则返回False
if hasattr(emp1, 'name'):
name_value = getattr(emp1, 'name') # 获取name属性值
print("name的属性值为:", name_value)
else:
print("员工属性不存在")
# 给实例添加一个属性
if hasattr(emp1, 'tel'):
print("员工属性已存在")
else:
setattr(emp1, 'tel', '17718533234')
t1 = getattr(emp1, 'tel')
print("tel的属性值为:", t1)
setattr(emp1, 'tel', '15042622134')
t2 = getattr(emp1, 'tel')
print("tel修改后的属性值为:", t2)
# 给实例删除一个属性
if hasattr(emp1, 'age'):
delattr(emp1, 'age')
else:
print("员工tel属性不存在")
# 验证属性是否删除成功
if hasattr(emp1, 'age'):
print("属性age存在!")
else:
print("属性age不存在!")
运行结果:
name的属性值为: Rose
tel的属性值为: 17718533234
tel修改后的属性值为: 15042622134
属性age不存在!
此外还有Python内置类属性,这里做简单介绍:
dict : 类的属性(获取类所有信息):结果返回一个字典包含类属性及属性值,类方法等所有类信息
doc :类的文档字符串,也就是类的帮助信息。
name: 类名
module: 类定义所在的模块 如果在当前模块返回’main’; 如果类位于一个导入模块mymod中,那么className.module 等于 mymod)
bases : 类的所有父类(包含了所有父类组成的元组)
实例:
#coding=utf-8
class Employee (object):
"""所有员工的基类"""
empCount = 0
def __init__(self, name, salary) :
#类的构造函数
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self) :
#类方法
print ("total employee ",Employee.empCount )
def displayEmployee(self) :
print ("name :",self.name , ", salary :", self.salary)
print ("Employee.__doc__:", Employee.__doc__ )
print ("Employee.__name__:", Employee.__name__ )
print ("Employee.__module__:", Employee.__module__ )
print ("Employee.__bases__:", Employee.__bases__ )
print ("Employee.__dict__:", Employee.__dict__ )
运行结果:
# coding=utf-8
class Employee(object):
"""所有员工的基类"""
empCount = 0
def __init__(self, name, salary):
# 类的构造函数
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
# 类方法
print("total employee ", Employee.empCount)
def displayEmployee(self):
print("name :", self.name, ", salary :", self.salary)
print("Employee.__doc__:", Employee.__doc__)
print("Employee.__name__:", Employee.__name__)
print("Employee.__module__:", Employee.__module__)
print("Employee.__bases__:", Employee.__bases__)
print("Employee.__dict__:", Employee.__dict__)
运行结果:
Employee.__doc__: 所有员工的基类
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: (,)
Employee.__dict__: {'__module__': '__main__', '__doc__': '所有员工的基类', 'empCount': 0, '__init__': , 'displayCount': , 'displayEmployee': , '__dict__': , '__weakref__': }
小结:
实例属性属于各个实例所有,互不干扰;
类属性属于类所有,所有实例共享一个属性;
不要对实例属性和类属性使用相同的名字,否则将产生难以发现的错误。
类对象不能访问实例属性
作者:假书生@以上就是关于对Python 类与对象编程详解三(类属性、实例属性)的详细介绍。欢迎大家对Python 类与对象编程详解三(类属性、实例属性)内容提出宝贵意见