面向对象总结

作业一:总结

1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性

只要是类内部定义的,并且没有被任何装饰器修饰过的方法,都是绑定到对象的方法。
例如:
	class A:
		def test(self): #这个就是绑定到对象的方法。
			pass
		
		def test1():    #这个也是绑定到对象的方法,只是实例对象.test1(),会报错。
						#因为用实例对象调用方法,会默认把对象名作为方法的第一个参数传入。而test1不需要参数。
			pass


绑定到对象:就给对象去用,

使用方式:实例对象.对象的绑定方法(),不用为self传值,如果有其他值需要传。

特性:调用时会把对象本身当做第一个参数传给对象的绑定方法

2.什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性

在类内部定义的,并且被装饰器@classmethod修饰过的方法,都是绑定到类的
例如:
class Foo:

	name="FOO"
	
	@classmethod					#绑定到类的方法
	def test(cls):                  #谁调用就把谁的类传入第一个参数。
		print(cls.name)
		
class Foo1(Foo):
	name="FOO1"
	
Foo.test()  ---->执行结果:打印   FOO	

Foo1.test() ---->执行结果:打印  FOO1

绑定到类:就给类去用。

使用方式:类.类的绑定方法()

特性:调用时会把类名当做第一个参数传给类的绑定方法

3.什么是解除绑定的函数,如何定义,如何调用,给谁用?有什么特性

在类内部定义中,用@staticmethod装饰的函数就是解除绑定的函数。
例如:
class Foo:
	
	@staticmethod           #定义一个解除绑定的函数。
	def pint(a,b,c):
		print(a,b,c)
		
Foo.pint(1,2,3)   ---->执行结果:打印    1 2 3       #类调用
a=Foo()
a.pint(4,5,6)  ------->执行结果:打印  4 5 6         #实例对象调用

既不与类绑定,也不与对象绑定,不与任何事物绑定

绑定的特性:自动传值(绑定到类的就是自动传类,绑定到对象的就自动传对象)

解除绑定的特性:不管是类还是对象来调用,都没有自动传值这么一说了

所以说staticmethod就是相当于一个普通的工具包

4.什么是property,如何定义,如何使用,给谁用,什么情况下应该将一个属性定义成property,有什么好处?

property负责把一个方法编程属性调用。

例如:
class Foo:
	
	@property
	def pint(self):
		print("hello world !")
		
a=Foo()
a.pint   ---------->执行结果:打印 hello world !

import math                            #导入数学模块
class Foo:
	def __init__(self,radius):         #圆的半径
		self.radius=radius

	@property                          #将函数area变成属性调用
	def area(self):                    #不能传值
		return math.pi*self.radius**2  #计算面积并返回

	@area.setter                       # 重新传入半径,计算面积: 对象.area=半径
	def area(self, radius):
		self.radius=radius
		print (math.pi * self.radius ** 2)

	@property
	def perimeter(self):
		return math.pi*2*self.radius   #计算周长并返回

a = Foo(10)            ---------------->实例化一个对象,半径为10

print(a.area)          ---------------->计算出半径为10的圆的面积

print(a.perimeter)     ---------------->计算出半径为10的圆的周长

a.area=20              ---------------->计算出半径为20的圆的面积
 
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,
根本无法察觉自己的name是执行了一个函数然后计算出来的,
这种特性的使用方式遵循了统一访问的原则,方便对象调用。

作业二:

要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用eval重新获取数据结构

with open('user.db','w') as write_file:
    write_file.write(str({
        "egon":{"password":"123",'status':False,'timeout':0},
        "alex":{"password":"456",'status':False,'timeout':0},
        }))

with open('user.db','r') as read_file:
    data=read_file.read()
    d=eval(data)
    print(d['egon']['password'])
    print(d['egon']['status'])
    print(d['egon']['timeout'])

要求二:定义用户类,定义属性db,执行obj.db可以拿到用户数据结构

class User:
    db_path='user.db'
    def __init__(self,username):
        self.username=username
    @property
    def db(self):
        data=open(self.db_path,'r').read()
        return eval(data)

u=User('egon')
print(u.db['egon'])
print(u.db['egon']['password'])

要求三:分析下述代码的执行流程

class User:
    db_path='user.db'
    def __init__(self,name):
        self.name=name
    @property
    def db(self):
        with open(self.db_path,'r') as read_file:
            info=read_file.read()
            return eval(info)
			
    @db.setter
    def db(self,value):
        with open(self.db_path,'w') as write_file:
            write_file.write(str(value))
            write_file.flush()

    def login(self):
        data=self.db
        if data[self.name]['status']:
            print('已经登录')
            return True
        if data[self.name]['timeout'] < time.time():
            count=0
            while count < 3:
                passwd=input('password>>: ')
                if not passwd:continue
                if passwd == data[self.name]['password']:
                    data[self.name]['status']=True
                    data[self.name]['timeout']=0
                    self.db=data
                    break
                count+=1
            else:
                data[self.name]['timeout']=time.time()+10
                self.db=data
        else:
            print('账号已经锁定10秒')

u1=User('egon')
u1.login()

u2=User('alex')
u2.login()

要求四:根据上述原理,编写退出登录方法(退出前要判断是否是登录状态),自定义property,供用户查看自己账号的锁定时间

def logout(self):
    data = self.db
    if not data[self.name]['status']:
        print('还未登录')
        return False

    else:
        data[self.name]['status'] = False
        data[self.name]['timeout'] = 0
        self.db = data
        print("已经退出!")

		
		
@property
	def sel(self):
		data = self.db
		time1=data[self.name]['timeout']
		lock_time=time.localtime(time1)
		return  "%s-%s-%s   %s-%s-%s" % (lock_time.tm_year,lock_time.tm_mon,lock_time.tm_mday,lock_time.tm_hour, lock_time.tm_min, lock_time.tm_sec)
posted @ 2017-09-12 20:23  hzxPeter  阅读(93)  评论(0编辑  收藏  举报