python进阶-面向对象编程二:类和对象的绑定和解除绑定/装饰器方法

类和对象的绑定和解除绑定

在类内部定义的函数无非三种用途
所谓方法就是函数和类或者类对象进行绑定
一:绑定到对象的方法
	只要是在类内部定义的,并且没有被任何装饰器修饰过的方法,都是绑定到对象的

	class Foo:
		def test(self): #绑定到对象的方法
			pass
		def test1(): #也是绑定到对象的方法,只是对象.test1(),会把对象本身自动传给test1,因test1没有参数所以会抛出异常
			pass

	绑定到对象,指的是:就给对象去用,
	使用方式:对象.对象的绑定方法(),不用为self传值
	特性:调用时会把对象本身当做第一个参数传给对象的绑定方法



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

	@classmethod
	def test3(cls):
		pass
	@classmethod
	def test4():
		pass

	绑定到对象,指的是:就给对象去用,
	使用方式:类.类的绑定方法;对象.对象的绑定方法(),绑定到类的对象也可以使用
	特性:调用时会把对象本身当做第一个参数传给对象的绑定方法


三:解除绑定的方法:staticmethod
	既不与类绑定,也不与对象绑定,不与任何事物绑定
	绑定的特性:自动传值(绑定到类的就是自动传类,绑定到对象的就自动传对象)
	解除绑定的特性:不管是类还是对象来调用,都没有自动传值这么一说了,那就是普通函数

	所以说staticmethod就是相当于一个普通的工具包
class Foo:
	def test1(self):
		pass
	def test2():
		pass



	@classmethod
	def test3(cls):
		pass
	@classmethod
	def test4():
		pass



	@staticmethod
	def test5():
		pass

test1与test2都是绑定到对象方法:调用时就是操作对象本身
	<function Foo.test1 at 0x0000000000D8E488>
	<function Foo.test2 at 0x0000000000D8E510>
test3与test4都是绑定到类的方法:调用时就是操作类本身
	<bound method Foo.test3 of <class '__main__.Foo'>>
	<bound method Foo.test4 of <class '__main__.Foo'>>
test5是不与任何事物绑定的:就是一个工具包,谁来都可以用,没说专门操作谁这么一说
	<function Foo.test5 at 0x0000000000D8E6A8>

  

@classmethod 装饰器

# classmethod,绑定类的方法,类和实例都可以使用且相等,但是传入的是类,子类可以调用

class Foo:
    def bar(self):
        pass

    @classmethod
    def testh(cls,x):
        print(cls,x)

Foo.testh(122)
f=Foo()
f.testh(123)


import time
print(time.localtime(time.time()))

  

@staticmethod 装饰器

# @staticmethod 专门给类用的调用自己的方法,给类扩展方法,计算机只认识时间秒,并把所有的秒作为时间戳格式,就是time.time
# time.localtime()转换为当前年月日是分秒格式

import time
# print(time.time())
# print(time.localtime())

class Date:
    def __init__(self,y,m,d):
        self.y=y
        self.m=m
        self.d=d


    @staticmethod
    def today():
        t=time.localtime()
        obj=Date(t.tm_year, t.tm_mon, t.tm_mday)
        return obj


    @staticmethod
    def tomorrow():
        t=time.localtime(time.time()+86400)
        obj=Date(t.tm_year, t.tm_mon, t.tm_mday)
        return obj

print(Date.today())
d=Date.today()
print(d.y,d.m,d.d)
print(Date.tomorrow())
t=Date.tomorrow()
print(t.y,t.m,t.d)
print(t)

  

@property装饰器

# @property把类函数变成实例自己的属性,调用时候去掉()操作,动态计算,优先于对象的使用
import math
class Circle:

    def __init__(self,r):
        self.r=r

    @property
    def area(self):
        return math.pi*self.r**2

    @property
    def perimiter(self):
        return 2*math.pi*self.r


c=Circle(4.5)
# print(c.area())
# print(c.perimiter())
print(c.area)
print(c.perimiter)

  

@方法名.setter/@方法名.deleter

class People:


    def __init__(self,name,sex):
        self.name=name
        self.sex=sex

    @property
    def sex(self):
        return self.__sex

    @sex.setter
    def sex(self,value):
        if not isinstance(value,str):
            raise TypeError("type error")
        else:
            self.__sex=value

    @sex.deleter
    def sex(self):
        del self.__sex

alex=People("alex","male")
alex.sex="female"
print(alex.sex)

  

总结回答

1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性
#
# 	绑定到对象的方法指的是:只要是在类内部定义的,并且没有被任何装饰器修饰过的方法,都是绑定到对象的
#     定义:
#     class Foo:
# 		def test(self): #绑定到对象的方法
# 			pass
# 		def test1(): #也是绑定到对象的方法,只是对象.test1(),会把对象本身自动传给test1,因test1没有参数所以会抛出异常
# 			pass
#
# 	调用:对象.对象的绑定方法(),不用为self传值
#     给谁用:给类的实例
# 	特性:调用时会把对象本身当做第一个参数传给对象的绑定方法
#
#
# 2.什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性
#     绑定到类的方法指的是:classmethod,在类内部定义的,并且被装饰器@classmethod修饰过的方法,都是绑定到类的
#     绑定类的方法,类和实例都可以使用且相等,但是传入的是类,子类可以调用
#     定义:
#     @classmethod
#     def test3(cls):
#         pass
#     @classmethod
#     def test4():
#         pass
# 	调用:类.类的的绑定方法(),不用为cls传值
#     给谁用:给类的实例
# 	特性:调用时会把类本身当做第一个参数传给类的绑定方法
#
#
# 3.什么是解除绑定的函数,如何定义,如何调用,给谁用?有什么特性
#     解除绑定的函数指的是:staticmethod既不与类绑定,也不与对象绑定,不与任何事物绑定
#     定义:
#     @staticmethod
#     def test5():
#         pass
#
# 	调用:类.类的的绑定方法(),对象.对象的绑定方法()
#     给谁用:给类以及对象
# 	特性:绑定的特性:自动传值(绑定到类的就是自动传类,绑定到对象的就自动传对象),
#          解除绑定的特性:不管是类还是对象来调用,都没有自动传值这么一说了,就是手动传,所以说staticmethod就是相当于一个普通的工具包
#
#
#
# 4.什么是property,如何定义,如何使用,给谁用,什么情况下应该将一个属性定义成property,有什么好处?
#        property:@property把类函数变成实例自己的属性,调用时候去掉()操作,动态计算,优先于对象的使用
#        定义:
#             import math
#             class Circle:
#
#                 def __init__(self,r):
#                     self.r=r
#
#                 @property
#                 def area(self):
#                     return math.pi*self.r**2
#
#                 @property
#                 def perimiter(self):
#                     return 2*math.pi*self.r
#
#         使用:
#                 c=Circle(4.5)
#                 # print(c.area())
#                 # print(c.perimiter())
#                 print(c.area)
#                 print(c.perimiter)
#
#         给谁用:给对象
# 	      场景:简化函数操作,增加增删改查功能
#         好处:利用属性的操作比属性更加强大的功能

  

 

 

  

 

posted @ 2017-09-13 15:17  Adamanter  阅读(272)  评论(0编辑  收藏  举报