Python 类

1、定义类
在关键字class用来定义类,class后面是类名,紧接着是(object),表示该类是从那个类继承下来的。

>>> class Student(object):
...     pass
... 
>>> 

2、类的属性
可以在类中的__init__ 方法在创建类的实例的时候,把一些必要的属性填写进去。

>>> class Student(object):
...     def __init__(self,name,age):
...             self.name=name
...             self.__age=age
... 

建立实例变量:

>>> mike=Student("Mike",18)

其中self.__age=age 中的两个”下划线”表示这是类的私有变量,私有变量在类外是不能访问的。(在Python中,变量名类似xxx的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是私有变量),也有的变量前边是单下划线,这是保护变量。两者之间的区别为:
“单下划线” ,保护变量,意思是只有类对象和子类对象自己能访问到这些变量;
“双下划线” ,私有变量,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
类的属性也可以在类的实例建立以后,动态添加。

>>> mike=Student("Mike",18)
>>> class Student(object):
...     pass
... 
>>> s=Student()
>>> s.name="Mike"
>>> s.name
'Mike'

除了动态的给对象添加变量,还可以给动态的添加方法

>>> def get_name(self):
...     return self.name
... 
>>> from types import MethodType
>>> s.get_name=MethodType(get_name,s,Student)
>>> s.get_name()
'Mike'

上述动态给类添加变量和方法只是给类的变量添加方法和变量,并没有对类的其它变量添加

>>> s1=Student()
>>> s1.name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'name'
>>> s1.get_name()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'get_name'
>>> 

下面的第一行是给类添加方法,而不是给类的对象添加方法

>>> Student.get_name=MethodType(get_name,None,Student)
>>> s1.get_name()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in get_name
AttributeError: 'Student' object has no attribute 'name'
>>> s1.name="Tom"
>>> s1.get_name()
'Tom'

可以在类中使用__slots__ 变量来限制class能够添加的变量

>>> class Student(object):
...     __slots__=('name','age')
... 
>>> s=Student()
>>> s.name='liu'
>>> s.name
'liu'
>>> s.age=18
>>> s.age
18
>>> s.score=18
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'
>>> 

__slots__ 定义的属性仅在当前类起作用,对继承的子类不起作用,除非在子类中也定义类__slots__ ,这样子类允许定义的属性就是当前的__slots__ 加上父类的__slots__
3、变量的设置与获取
可以在类中写相应的get,set方法来设置,获取属性值。Python可以通过内置的@property 来把一个方法变成属性调用的。

class Student(object):

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

    @score.setter
    def score(self,value):
        if not isinstance(value,int):
            print "typeError!"
        if value<0 or value>100:
            print "data is invalid!"
        self.grade=value
s=Student()
s.score=90
print s.score

结果:

90
[Finished in 0.0s]

但是在Student类中,如果写成

class Student(object):

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

    @score.setter
    def score(self,value):
        if not isinstance(value,int):
            print "typeError!"
        if value<0 or value>100:
            print "data is invalid!"
        self.score=value

则会报RuntimeError: maximum recursion depth exceeded ,上网差了一下,发现需要做本地化处理。self.score=value 会调用自身,形成递归。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值