#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'>
Python练习2 - 廖雪峰教程
最新推荐文章于 2020-08-20 17:54:57 发布