您的位置:首页 > 其它

面向对象

2016-06-17 09:48 399 查看
练习的代码

std1 = {'name':'Michael', 'score':98}
std2 = {'name':'Bob', 'score':81}
def print_score(std):
print('%s: %s' %(std['name'], std['score']))
print_score(std1)

class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
#__init__方法的第一个参数永远是self,表示创建的实例本身
def print_score(self):
print('%s:%s' % (self.name, self.score))
bart = Student('bart Simpson', 59)
lisa = Student('Lisa Simpson', 87)
print('______________')
bart.print_score()
lisa.print_score()

class Student(object): #object表示Student类是从object类继承来的
pass
bart = Student()
print(bart)
print(Student)
bart.name = 'Bart Simpson'
print(bart.name)

class Teacher(object):
def __init__(self, name, subject):
self.name = name
self.subject = subject
def print_subject(self):
print('%s:%s' % (self.name, self.subject))
t = Teacher('wangxin', 'math')
t.print_subject()


class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def get_name(self):
return self.__name
def get_score(self):
return self.__score
def set_name(self, name):
self.__name = name
def set_score(self, score):
if 0 <= score <= 100:
self.__score = score
else:
raise ValueError('bad score')
def print_score(self):
print('%s:%s' % (self.__name, self.__score))
bart = Student('bart Simpson', 59)
lisa = Student('Lisa Simpson', 87)
#变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名
#双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量:
bart._Student__score = 98
bart.print_score()
#有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。


class Animal(object):
def run(self):
print('Animal is running……')
class Dog(Animal):
def run(self):
print('Dog is running……')
def eat(self):
print('Eating meat……')
class Cat(Animal):
pass
dog = Dog()
dog.run()
cat = Cat()
cat.run()
#对真正的文件对象,它有一个read()方法,返回其内容。
# 但是,许多对象,只要有read()方法,都被视为“file-like object“。
# 许多函数接收的参数就是“file-like object“,你不一定要传入真正的文件对象,完全可以传入任何实现了read()方法的对象。

class Timer(object):
def run(self):
print('Start……')
t1 = Timer()
t1.run()

t = type(123)
print(t)
t = type('str')
print(t)
t = type(None)
print(t)

t = type(abs)
print(t)
print(type(123) == type(456))
print(type(123) == int)
print(type('abc') == str)
#判断基本数据类型可以直接写int,str等,但如果要判断一个对象是否是函数怎么办?可以使用types模块中定义的常量:
import types
def fn():
pass
print(type(fn) == types.FunctionType)
print(type(abs) == types.BuiltinFunctionType)
print(type(lambda x:x) == types.LambdaType)
print(type((x for x in range(10))) == types.GeneratorType)
#判断某个变量是否是某些类型中的一种
t = isinstance([1, 2, 3], (list, tuple))
print(t)
t = isinstance((1, 2, 3), (list, tuple))
print(t)
#如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,
# 比如,获得一个str对象的所有属性和方法:
t = dir('ABC')
print(t)

#类似__xxx__的属性和方法在Python中都是有特殊用途的,比如__len__方法返回长度。
# 在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,
# 它自动去调用该对象的__len__()方法,所以,下面的代码是等价的:
print(len('ABC'))
print('ABC'.__len__())
t = 'ABC'.lower()
print(t)
#我们自己写的类,如果也想用len(myObj)的话,就自己写一个__len__()方法:
class MyDog(object):
def __len__(self):
return 100
dog = MyDog()
print(len(dog))

class MyObject(object):
def __init__(self):
self.x = 9
def power(self):
return self.x * self.x
obj = MyObject()
print(hasattr(obj, 'x'))
print(obj.x)
print(hasattr(obj, 'y'))
#给obj对象设置一个属性y
setattr(obj, 'y', 19)
print(hasattr(obj, 'y'))

print(getattr(obj, 'y'))
print(obj.y)
#可以在getattr中传入一个default参数,如果属性不存在,就返回默认值
print(getattr(obj, 'z', 404))
t = hasattr(obj, 'power')
print(t)
t = getattr(obj, 'power')
print(t())
sum = obj.x + obj.y
print(sum)
sum = getattr(obj, 'x') + getattr(obj, 'y')
print(getattr(obj, 'x'))
print(getattr(obj, 'y'))
print(sum)


#假设我们希望从文件流fp中读取图像,我们首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取。hasattr()就派上了用场。
#def readImage(fp):
#    if hasattr(fp, 'read'):
#        return readData(fp)
#    return None
class Student(object):
def __init__(self, name):
self.name = name
s = Student('Bob')
s.score = 90
#当我们定义了一个类属性后,这个属性虽然归类所有,但类的所有实例都可以访问到。
class Student(object):
name = 'Student'
s = Student()
print(s.name)#  # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
print(Student.name)#打印类的name属性
s.name = 'Michael'
print(s.name)
print(Student.name)
del s.name
print(s.name)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: