python内置类属性name_Python 类与对象编程详解三(类属性、实例属性)

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 类与对象编程详解三(类属性、实例属性)内容提出宝贵意见

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值