一、绑定方法与非绑定方
1). 类内部定义的函数,分为两大类:
-
绑定方法 (对象实例方法、类实例方法) :绑定给谁,就应该由谁来调用,谁来调用就回把调用者当作第一个参数自动传入
- 绑定到对象的方法:
- 没有使用注解
- 实例对象可以调用,默认传入本身实例
- 类调用需要传入实例对象
- 绑定到类的方法:
- 使用的注解为
@classmethod - 实例对象与类都可以访问
- 使用的注解为
- 绑定到对象的方法:
-
非绑定方法 (静态方法) :没有自动传值这么一说了,就类中定义的一个普通工具,对象和类都可以使用
- 非绑定方法:
- 不与类或者对象绑定,使用的注解为
@staticmethod - 都可以访问
- 不与类或者对象绑定,使用的注解为
- 非绑定方法:
2). 绑定方法使用方式
class Foo:
def __init__(self,name):
self.__name = name
def tell(self): # 绑定到对象的方法
print("名字是%s" % self.__name)
@classmethod # 绑定到类方法,装饰为类方法,由类来调用
def f1(cls): # 将类名当做第一个参数传入
print(cls)
@staticmethod # 非绑定方法,对象,类都可以使用,相当于普通函数
def f2(x,y):
print("%s",x * y)
print(Foo.__dict__)
f = Foo("f")
Foo.f1()
f.f1() # 实例也可以调用
3). 使用场景
import settings
import hashlib
import time
class People:
def __init__(self,name,age,sex):
self.id=self.create_id()
self.name=name
self.age=age
self.sex=sex
def tell_info(self): #绑定到对象的方法
print('Name:%s Age:%s Sex:%s' %(self.name,self.age,self.sex))
@classmethod #类方法,与类绑定,使用类名进行调用
def from_conf(cls): #从配置文件里面产生一个对象
obj=cls(
settings.name,
settings.age,
settings.sex
)
return obj
@staticmethod # 静态方法,不依赖类与对象实例
def create_id():
m=hashlib.md5(str(time.time()).encode('utf-8'))
return m.hexdigest()
# p=People('egon',18,'male')
# 绑定给对象,就应该由对象来调用,自动将对象本身当作第一个参数传入
# p.tell_info() #tell_info(p)
# 绑定给类,就应该由类来调用,自动将类本身当作第一个参数传入
# p=People.from_conf() #from_conf(People)
# p.tell_info()
# 非绑定方法,不与类或者对象绑定,谁都可以调用,没有自动传值一说
p1=People('egon1',18,'male')
p2=People('egon2',28,'male')
p3=People('egon3',38,'male')
print(p1.id)
print(p2.id)
print(p3.id)
二、property的使用
-
@property注解将动作封装起来,对于使用者可以向数据属性一样获取,适合根据数据属性进行计算的动作
class People:
def __init__(self,name,weight,height):
self.name=name
self.weight=weight
self.height=height
@property #
def bmi(self):
return self.weight / (self.height ** 2)
p=People('egon',75,1.81)
print(p.bmi)
p.height=1.82
print(p.bmi) # 像数据属性一样调用
p.bmi=3333 #报错AttributeError: can't set attribute,虽然像数据属性,但是本质还是方法!
- property的其他用法
class People:
def __init__(self,name):
self.__name = name
@property
def name(self): #将方法封装,对于用户而言就是变量
return self.__name
@name.setter #当上面定义了property,才能这么使用,而且函数名必须一样,对于用户相当于操作变量属性
def name(self,val):
if not isinstance(val,str):
return print("名字必须是字符串类型!")
self.__name = val
@name.deleter #当上面定义了property,才能这么使用,而且函数名必须一样,对于用户相当于操作变量属性
def name(self):
print("不允许删除")
p = People("Egon")
print(p.name)# Egon
p.name = "xiaoqing"
print(p.name)# xiaoqing
del p.name # 不允许删除






网友评论