Python练习2 - 廖雪峰教程

#coding:utf-8
class Student1(object):
    pass

#尝试给实例绑定一个属性:
s = Student1()
s.name = 'Michael'
print s.name

#尝试给实例绑定一个方法:
def set_age(self,age):
    self.age = age
from types import MethodType
s.set_age = MethodType(set_age,s,Student1)
s.set_age(25)
print s.age

#为了给所有实例都绑定方法,可以给class绑定方法:
def set_score(self,score):
    self.score = score

Student1.set_score = MethodType(set_score,None,Student1)
s.set_score(100)
print s.score

#=======================================================================================

#为了限制score的范围
class Student2(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
s = Student2()
s.set_score(60)
print s.get_score()
#s.set_score(101) #提示出错了


#Python内置的@property装饰器就是负责把一个方法变成属性调用的
class Student3(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


#还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性:
class Student4(object):

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

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

    @property
    def age(self):
        return 2014 - self._birth
#上面的birth是可读写属性,而age就是一个只读属性,因为age可以根据birth和当前时间计算出来。


#===============================================================================================
#多重继承

class Animal(object):
    pass

# 大类:
class Mammal(Animal):
    pass
class Bird(Animal):
    pass

class Runnable(object):
    def run(self):
        print('Running...')

class Flyable(object):
    def fly(self):
        print('Flying...')    

# 各种动物:
class Dog(Mammal,Runnable):
    pass
class Bat(Mammal,Flyable):
    pass
class Parrot(Bird):
    pass
class Ostrich(Bird):
    pass



#===============================================================================
#定制类
#我们先定义一个Student类,打印一个实例:
class Student5(object):
    def __init__(self,name):
        self.name = name
print Student5('Michael')

class Student6(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return 'Student object (name:%s)' %self.name
    __repr__ = __str__  #偷懒写法
print Student6('Michael')        
#但是细心的朋友会发现直接敲变量不用print,打印出来的实例还是不好看:
#这是因为直接显示变量调用的不是__str__(),而是__repr__()
#__str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串

#__iter__

class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1 # 初始化两个计数器a,b

    def __iter__(self):
        return self # 实例本身就是迭代对象,故返回自己

    def next(self):
        self.a, self.b = self.b, self.a + self.b # 计算下一个值
        if self.a > 100000: # 退出循环的条件
            raise StopIteration();
        return self.a # 返回下一个值
    def __getitem__(self, n):
        if isinstance(n, int):
            a, b = 1, 1
            for x in range(n):
                a, b = b, a + b
            return a
        if isinstance(n, slice):
            start = n.start
            stop = n.stop
            a, b = 1, 1
            L = []
            for x in range(stop):
                if x >= start:
                    L.append(a)
                a, b = b, a + b
            return L
for n in Fib():
    print n
f=Fib()
print f[100]
print f[0:5]
print f[:10]

# myFile = open('test.txt')
# for eachLine in myFile:
#     print eachLine,

# from hello import Hello
# h = Hello()
# h.hello()
# print type(Hello)
# print type(h)

#我们可以通过type()函数创建出Hello类
def fn(self,name = 'world'):
    print('Hello,%s' %name)
Hello = type('Hello',(object,),dict(hello = fn))
h = Hello()
h.hello()
print type(Hello)
print type(h)
#Hello,world
# <type 'type'>
# <class '__main__.Hello'>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值