property,私有变量

# 如果要让内部属性不被外部访问,可以把属性的名称前加两个下划线__,在python中,实例的变量如果以__双下划线开头,就变成了一个私有变量(private),z只有内部可以访问,外部不能访问。
### gender改为私有变量的案例:
"""class Student(object):
def init(self, |name, gender):
self.name = name
self.__gender = gender
def set_gender(self,gender):
if (gender==‘male‘ or gender==‘female‘or gender==‘trans female‘ or gender==‘trans male‘):
self.__gender=gender
else:
self.__gender="whatever it is, i‘m proud of you"

def get_gender(self):
return self.__gender
"""

‘class Student(object):\n    def init(self, |name, gender):\n        self.name = name\n        self.__gender = gender\n    def set_gender(self,gender):\n    if (gender==\‘male\‘ or gender==\‘female\‘or gender==\‘trans female\‘ or gender==\‘trans male\‘):\n        self.__gender=gender\n    else:\n        self.__gender="whatever it is, i\‘m proud of you"\n\n    def get_gender(self):\n        return self.__gender\n‘
### 实例属性和类属性
### 为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加:
class Student:
    count = 0
    def __init__(self):
        Student.count += 1
#     print(Student.count)

aa = Student()
b =Student()
c = Student()
print(Student.count)
3
# 类的继承和多态
# 类的继承是子类获得了父类的全部功能
class Animal:
    def run(self):
        print(‘Animal is running‘)

class Dog(Animal):
    pass

dog = Dog()
dog.run()
Animal is running
# 使用__slots__
# 但是,如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性。
# 为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性
class Student:
    __slots__ =(‘name‘, ‘age‘)
    def study(self):
        pass
# 只允许添加这两个属性:name, age
@property
在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:
s = Student()
s.score = 9999
这显然不合逻辑。为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数:
class Student(object):

    def get_score(self):
         return self._score

    def set_score(self, value):
        if not isinstance(value, int):
            raise ValueError(‘score must be an integer!‘)
        if value < 0 or value > 100:
            raise ValueError(‘score must between 0 ~ 100!‘)
        self._score = value
现在,对任意的Student实例进行操作,就不能随心所欲地设置score了:
>>> s = Student()
>>> s.set_score(60) # ok!
>>> s.get_score()
60
>>> s.set_score(9999)
Traceback (most recent call last):
  ...
ValueError: score must between 0 ~ 100!
但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。
有没有既能检查参数,又可以用类似属性这样简单的方式来访问类的变量呢?对于追求完美的Python程序员来说,这是必须要做到的!
还记得装饰器(decorator)可以给函数动态加上功能吗?对于类的方法,装饰器一样起作用。Python内置的@property装饰器就是负责把一个方法变成属性调用的:
class Student(object):

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError(‘score must be an integer!‘)
        if value < 0 or value > 100:
            raise ValueError(‘score must between 0 ~ 100!‘)
        self._score = value
@property的实现比较复杂,我们先考察如何使用。把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作:
>>> s = Student()
>>> s.score = 60 # OK,实际转化为s.set_score(60)
>>> s.score # OK,实际转化为s.get_score()
60
>>> s.score = 9999
Traceback (most recent call last):
  ...
ValueError: score must between 0 ~ 100!
注意到这个神奇的@property,我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。
还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性:
class Student(object):

    @property
    def birth(self):
        return self._birth

    @birth.setter
    def birth(self, value):
        self._birth = value

    @property
    def age(self):
        return 2015 - self._birth
上面的birth是可读写属性,而age就是一个只读属性,因为age可以根据birth和当前时间计算出来。
  File "<ipython-input-12-a75b5e8e6113>", line 1
    在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:
                                                       ^
SyntaxError: invalid character in identifier

原文地址:http://blog.51cto.com/13118411/2155479

时间: 2024-10-10 20:57:01

property,私有变量的相关文章

iOS动态性 运行时runtime初探(强制获取并修改私有变量,强制增加及修改私有方法等)

借助前辈的力量综合一下资料. OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法.利用runtime机制让我们可以在程序运行时动态修改类.对象中的所有属性.方法,就算是私有方法以及私有属性都是可以动态修改的.本文旨在对runtime的部分特性小试牛刀,更多更全的方法可以参考系统API文件<objc/runtime.h>,demo例子可以参见CSDN的runtime高级编程系列文章. 我们出发吧! 先看一个非常平常的Father类: #import <Fou

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category,覆盖原类的方法,即使不引用该category头文件,也能覆盖,respondsToSelector:方法也能响应.2.category,不可以有私有变量,但是可以有@property的声明,property的声明只是声明了该类的set,get方法(需要引用该category的头文件),但是categ

Objective-C 私有变量和私有方法如何实现?

先说私有方法,由于Objective-C的动态消息传递机制,OC中不存在真正意义上的私有方法.但是如果你不在.h文件中声明,只在.m文件中实现,或在.m文件的Class Extension里声明,那么基本上和私有方法差不多. 至于私有变量是可以通过@private来声明的,例如 @interface Sample : NSObject{ @private NSString *tteesstt; } @property (nonatomic,strong) NSString *hoge; - (v

OC-私有方法和私有变量

以前没有太注意这个私有方法和私有变量,后来吃了很多亏, 今小总结一下: 1> 私有方法 概念:就是没有在.h文件中声明,只在.m文件实现的方法. 使用:私有方法只能在本类中使用,不能在子类和分类中使用. 2>私有变量 概念1:就是在.m文件中定义的变量 概念2:就是通过@property自动生成的私有成员变量; 使用:私有变量也是只能在本类中使用,分类和子类都不能使用. 3>声明为私有的变量 概念:声明为私有的变量,就是在.h文件中,定义的成员变量之前修饰符为@private. 使用:

oc中私有变量、私有方法

oc中私有变量.私有方法 私有变量 私有变量既是类的成员变量,仅能在类的内部使用,不受外部访问 定义方法有: 1. 定义在.h文件的{}中,使用关键字@private,如: @interface Test () { @private NSString *string_; } @end 1 2 3 4 5 6 2.也是定义在.h文件的{}中,但不使用关键字@private 3.定义在.m文件的@property,如下: @interface Test () @property (nonatomic

Javascript的私有变量和方法、共有变量和方法以及特权方法、构造器、静态共有属性和静态共有方法

一.私有变量:定义在函数内部的属性和方法称之为该函数的私有属性和方法        共有变量:在函数内部通过this创建的对象和方法称之为该函数的共有属性和方法 特权方法:通过this创建的既可以访问该函数的共有属性和方法,也可以访问该函数的私有属性和方法称之为特权方法 构造器:对象在创建的时候调用特权方法来初始化实例的属性,这个方法也称为构造器 /** * 类的内部私有属性.私有方法.特权方法.共有属性和共有方法以及构造器 * @param id * @param bookname * @pa

四.OC基础--1.文档安装和方法重载,2.self和super&amp;static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&amp;私有方法,6.description方法

四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 3. 方法重载: 是指在一个类中定义多个同名的方法 在OC中没有重载 2.self和super&static, self和super: 1. self理解: 谁调用当前方法, self就代表谁. 比如: 在对象方法中,self代表的是对象, 因为只有对象才可以调用对象方法 在类方法中, self代表的

7.4 私有变量

严格来讲,JavaScript并没有什么私有变量的概念,但是从作用域的角度来看,一个是全局,函数: 在函数中定义的变量都可以称之为 私有变量:因为不能在函数外部访问: 1 function add(num1,num2){ 2 var sum = num1 + num2; 3 return sum; 4 } 上面代码完成两个数字累加,函数内部声明三个私有变量,num1, num2, sum. 在函数内部可以访问这几个变量,但函数外部则不能访问它们. 如果在这个函数内部创建一个闭包,那么闭包通过自己

js实现私有变量

一.块级作用域 js中没有块级作用域的概念,可用匿名函数实现 (function(){ //块级作用域 })(): 二.私有变量 只能函数内部访问,外界无法访问