一、属性定义
1、类属性
类属性定义在类中且在函数体之外;类属性通常不作为实例属性使用;类变量紧接在类名后面定义
类属性的引用:类名.count eg:Employee.count
实例中可以引用类的属性:
a、通过类名引用
b、通过实例名:读取的操作,写的操作(操作的属性是实例的属性,不是类的属性,对类的属性没有影响)
 
2、实例属性
定义在方法中的变量,只作用于当前实例的类;实例变量在__init__()函数里定义
如果所添加的属性名与类中类属性名相同的时,类属性在这个实例对象中就会被屏蔽掉,也就是说实例引用时,同名的实例属性会屏蔽同名的类属性,就类似于全局变量与局部变量的关系。
 
3、局部变量
在类的实例方法中定义的变量,叫局部变量,其作用域仅限于其所在的函数内部,执行到该函数,局部变量生成,函数退出后,局部变量被消亡。
 
4、@porperty 属性装饰器
使用:
@property
def score(self):
return self.__score
s1=Student('a',18,90)
print s1.score 直接把方法当属性使用
 
@property.setter @score.setter 修饰器 修改
def score(self,score):
pass
 
s1.score=98 修饰器
@property.deleter @score.deleter 删除
eg:
#encoding=utf-8
class Goods(object):
def __init__(self,price):
self.__price=price
@property
def price(self):
print '@porperty'
return self.__price
@price.setter
def price(self,price1):
self.__price=price1
print '@price setter'
@price.deleter
def price(self):
del self.__price
print '@price.deleter'
 
obj=Goods(100)
print obj.price
obj.price=123
del obj.price
 
5、类的私有属性
两个下划线开头属性,声明该属性为私有属性,不能在类的外部被使用或直接访问,只能在类内部访问。在类内部的方法中使用时的语法:self.__private_attrs。 eg:self.__name
eg:
class Person(object):
__secretCount = 0 #私有属性
def __init__(self, name):
self.name = name #实例属性
self.__inName = 'ads' #私有属性
def visit_private_attribute( self ):
self.__secretCount += 1
print "__secretCount: ", self.__secretCount
print u"__inName:", self.__inName
p = Person("prel")
p.visit_private_attribute() 通过方法获取类的私有属性
print u"在类外直接通过实例访问私有属性"
print p.__inName 在类外直接调用,会报错
 
python的语法并不是那么严格的能够保证私有变量不被随意改动,以下方式可以访问私有属性:
object._className__attrName eg:p._Person__inName
 
二、属性相关
1、修改类属性
修改类属性的值,有三种方法,分别为:
(1)通过类方法修改
(2)通过实例方法修改
(3)直接通过类对象修改
#coding=utf-8
class employee(object) :
city = 'BJ' #类属性
def __init__(self, name) :
self.name = name #实例变量
#定义类方法
@classmethod
def getCity(cls) :
return cls.city
#定义类方法
@classmethod
def setCity(cls, city) :
cls.city = city
#实例方法
def set_City(self, city) :
employee.city = city
 
调用:
emp = employee('joy') #创建类的实例
print emp.getCity() #通过实例对象引用类方法
print employee.getCity()#通过类对象引用类方法
emp.setCity('TJ')#实例对象调用类方法改变类属性的值
print emp.getCity()
print employee.getCity()
employee.setCity('CD')#类对象调用类方法改变类属性的值
print emp.getCity()
print employee.getCity()
emp.set_City('SH')#调用实例方法修改类属性的值
print emp.getCity()
print employee.getCity()
employee.city = 20 #直接修改类属性的值
print emp.getCity()
print employee.getCity()
 
2、作用域
print locals() 返回所有的局部变量
print globals() 返回所有的全局变量
在python的作用域规则里面,创建变量时一定会在当前作用域里创建同样的变量,但访问或修改变量时,会在当前作用域中查找该变量,如果没找到匹配的变量,就会依次向上在闭合作用域中进行查找,所以在函数中直接访问全局变量也是可以的

Python之面向对象:属性的更多相关文章

  1. python day20面向对象-属性,类方法,静态方法

    一.属性的初识 # class Person: # # def __init__(self,name,hight,weight): # self.name = name # self.__hight ...

  2. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  3. Python中的属性管理

    Python管 理属性的方法一般有三种:操作符重载(即,__getattr__.__setattr__.__delattr__和 __getattribute__,有点类似于C++中的重载操作符).p ...

  4. Python的面向对象3

    接下来,我们接着讲Python的面向对象,在上一次的博客中,我们详细介绍了类与对象的属性,今天,我们来详细介绍一下面向对象中的方法! 1.定义实例方法 一个实例的私有属性就是以__开头的属性,无法被外 ...

  5. Python的面向对象2

    我们接着讲解Python的面向对象 1.初始化实例属性 在现实生活中,一种类型的实例会具有相同的某些属性,把这些实例划分为一个类型,则这些实例必然有相似的部分.但是,在创建实例之后,我们一个一个的为实 ...

  6. Python的面向对象1

    今天,我们来介绍Python的面向对象编程,其实面向对象并不陌生,在C++  ,Java  ,PHP中也有大量使用! 好了,我们来步入正题! 那什么是面向对象编程呢? 1. 面向对象编程是一种程序设计 ...

  7. Python进阶---面向对象的程序设计思想

    Python的面向对象 一.面向过程与面向对象的对比 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...

  8. Python之面向对象一

    引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blood,aggr,kind): dog = ...

  9. python基础——面向对象进阶下

    python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...

  10. python基础——面向对象进阶

    python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...

随机推荐

  1. mbstring未安装

    yum install php55w-mbstring.x86_64 把php版本换成自己的就ok

  2. 使用Servlet根据浏览器request的get方法获取值,将磁盘中与之对应的json数据删除的方法

    package com.swift; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStrea ...

  3. java 获取request中的请求参数

    1.get 和 post请求方式 (1)request.getParameterNames(); 获取所有参数key后.遍历request.getParameter(key)获取value (2)re ...

  4. 17.VUE学习之- v-for指令的使用方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 虚拟机中配置SQL SERVER2008R2远程访问

    VM虚拟机中配置数据库访问 选择虚拟机设置--硬件--网络适配器,选择桥接模式:直接连接物理网络 不可选用主机模式(与主机共享专用网络) 数据库远程配置,转自:http://jingyan.baidu ...

  6. Unidirectional TSP UVA - 116 多段图的最短路

    题目:题目链接 思路:从后往前进行dp,用next数组记录字典序最小的那一条路径 AC代码: #include <iostream> #include <cstdio> #in ...

  7. postgreysql

    基础 syntax * \help 生成所有的pg命令 * abort 终止事务/work * alter aggregate 修改聚合函数的定义 ALTER AGGREGATE name ( typ ...

  8. Sql日期时间格式转换(转 子夜.)

    sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-0 ...

  9. volley框架使用

    volley网络请求一个json数据很简单,一句话就搞定了. StringRequest stringRequest=new StringRequest(url, new Listener<St ...

  10. export、export default、module.export区别

    在es6里面定义模块,导出模块时可以使用export.export default 这2者区别: 在同一个文件里面可以有多个export, 一个文件里面只能有1个export default //a. ...