一. 内置函数
1.@property(用于场景方法不要传递参数 且有return可以使用 就是普通函数)
property 内置装饰器函数 只在面向对象中使用 函数的作用是在新式类中返回属性值。
from math import pi
print(pi)
class Circle:
def __init__(self,r):
self.r=r
def per(self): # 周长
return 2*pi*self.r
def aer(self): # 面积
return self.r**2*pi
aa=Circle(3)
print(aa.per())
print(aa.aer())
from math import pi
# property() 函数的作用是在新式类中返回属性值。 把方法伪装成属性了
class Circle:
def __init__(self, r):
self.r = r
@property # @property 把方法伪装成属性了
def per(self): # 周长 使用 @property 伪装成属性 不能单参数
return 2 * pi * self.r
@property
def aer(self): # 面积
return self.r ** 2 * pi
aa = Circle(3)
print(aa.per) # @property 把方法伪装成属性了 调用了 但是不能 传递任何参数
print(aa.aer)
class Person(object):
def __init__(self,name,high,weight):
self.name=name
self.high=high
self.weight=weight
@property
def bim(self):
return self.weight/self.high**2
cc=Person("李四",1.7,100)
# print(cc.bim())
print(cc.bim) # @property 把方法变成了属性来调用
class Pers(object):
def __init__(self,name):
self.__name=name
@property # 有了@property 里面的方法名可以一样
def aa(self):
return self.__name+'----sb啊哈哈哈哈哈'
@aa.setter # @aa.setter 修改
def aa(self,new_name):
self.__name = new_name
f=Pers("王五")
print(f.aa) # 使用@property 修改里面的方
f.aa='爸爸'
print(f.aa)
# 王五----sb啊哈哈哈哈哈
# 爸爸----sb啊哈哈哈哈哈
print("*********************************************8")
class Persa(object):
def __init__(self,name):
self.__name=name
@property
def name(self):
return self.__name+'-------sb哈哈哈哈哈'
@name.setter # @property把方法变成属性方法访问 对象的修改 @name.setter 注意这三个nane要相同
def name(self,new_name):
self.__name=new_name
d=Persa("李四")
print(d.name)
d.name='王五'
print(d.name)
# 李四-------sb哈哈哈哈哈
# 王五-------sb哈哈哈哈哈
案例print("# 案例使用1")
class Goo(object):
dazhe=0.5
def __init__(self,name,price):
self.name=name
self.__price=price
def pr(self):
return self.__price*Goo.dazhe
a=Goo("西瓜",8)
print(a.pr())
# 案例使用1
# 4.0
print("***************************************************88")
print("# 案例使用2")
class Goo(object):
dazhe=0.5
def __init__(self,name,price):
self.name=name
self.__price=price
@property
def pr(self):
return self.__price*Goo.dazhe
a=Goo("西瓜",8)
print(a.pr)
# # 案例使用2
# 4.0
class Pe(object):
def __init__(self,name):
self.__name=name
@property
def name(self):
return self.__name
@name.deleter
def name(self):
print("执行了")
# del self.__name
d=Pe("李四")
print(d.name)
del d.name
print(d.name)
# 李四
# 执行了
# 李四
@方法名.setter:被 @方法名.setter 装饰的函数装饰函数名字必须和方法名字相同
class Persa(object):
def __init__(self,name):
self.__name=name
@property
def name(self):
return self.__name+'-------sb哈哈哈哈哈'
@name.setter # @property把方法变成属性方法访问 对象的修改 @name.setter 注意这三个nane要相同
def name(self,new_name):
self.__name=new_name
d=Persa("李四")
print(d.name)
d.name='王五'
print(d.name)
print("****************************************************************")
# 删除
# 借助公用的方法 删除私有的属性
class Pe(object):
def __init__(self,name):
self.__name=name
@property
def name(self):
return self.__name
@name.deleter
def name(self):
print("执行了")
# del self.__name
d=Pe("李四")
print(d.name)
del d.name
print(d.name)
print("****************************************************************")
# @方法名.setter:被 @方法名.setter 装饰的函数装饰函数名字必须和方法名字相同,方法名修改,会执行这个装饰的函数,
#coding=utf-8
# ############### 定义 ###############
class Goods:
"""python3中默认继承object类
以python2、3执行此程序的结果不同,因为只有在python3中才有@xxx.setter @xxx.deleter
"""
def __init__(self,num):
self.__num=num
@property #方法必须先进行@property
def price(self):
print(self.__num,"哈哈哈哈哈哈哈哈哈")
@price.setter
def price(self, value): #函数名必须和方法相同
self.__num=value
@price.deleter
def price(self):
print('@price.deleter')
# ############### 调用 ###############
obj = Goods(22)
obj.price # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
obj.price = 123 # 自动执行 @price.setter 修饰的 price 方法,并将 123 赋值给方法的参数
obj.price
# del obj.price # 自动执行 @price.deleter 修饰的 price 方法
# 22 哈哈哈哈哈哈哈哈哈
# 123 哈哈哈哈哈哈哈哈哈
2.@classmethod
# @classmethod 至少有一个参数 cls 类名.方法名
# 使用 场景 如果方法会使用到当前类 那么就可以使用类方法
class Gn(object):
bar=11111
def __init__(self,name,age):
self.name=name
self.age=age
def aa(self):
print(f'我叫--{self.name}--今年{self.age}')
pass
def cc(self):
print("卧槽11111111111111111111111111111111111111")
@classmethod
def bb(cls):
print("哈哈哈哈哈哈哈")
print(cls.bar)
print(cls)
ss=Gn("李四",5555)
ss.aa()
Gn.bb() # 通过类来调用的方法 推荐使用
# ss.bb() # 也可通过对象类调用的方法
# 我叫--李四--今年5555
# 哈哈哈哈哈哈哈
# 11111
# <class '__main__.Gn'>
print("*********************************************************************8")
class Gn(object):
bar=11111
def __init__(self,name,age):
self.name=name
self.age=age
def aa(self):
print(f'我叫--{self.name}--今年{self.age}')
def cc(self):
print("卧槽11111111111111111111111111111111111111")
@classmethod
def bb(cls,aa,bb):
print("哈哈哈哈哈哈哈")
print(cls.bar)
print(cls)
print(aa,bb)
ss=Gn("王五",666)
ss.aa()
Gn.bb("大象","业绩") # 通过类来调用的方法 推荐使用
# ss.bb() # 也可通过对象类调用的方法
# 我叫--王五--今年666
# 哈哈哈哈哈哈哈
# 11111
# <class '__main__.Gn'>
# 大象 业绩
class Room(object):
name1 = "张无忌来了哈哈"
def __init__(self, name, owner, width, length, height):
self.name = name
self.owner = owner
self.width = width
self.length = length
self.height = height
def cal_self(self):
# print('%s 住 的 面-%s总的面积是--------%s'%(self.owner,self.name,self.width*self.length))
return self.width * self.length
def test(self, name):
print("来自", self.name)
def test_call(self):
print("我是------", self.name1)
print(Room.name1) # 张无忌来了哈哈
# Room.test("中国")
# 这个表示类和实例化参数绑定到一块了
a2 = Room("别墅111", "哈哈哈哈哈", 2200, 100, 1000000000)
Room.test_call(a2)
# 张无忌来了哈哈
# 我是------ 张无忌来了哈哈
classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。
class A(object):
bar = 1
def func1(self):
print ('foo')
@classmethod
def func2(cls):
print ('func2')
print (cls.bar)
cls().func1() # 调用 foo 方法
A.func2() # 不需要实例化
# func2 # 1 # foo
class Da(object):
cc="188888"
def __init__(self,name):
self.name=name
@classmethod
def aa(cls,ll):
print("反射!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11")
print(cls.cc)
print(ll)
f=Da("张三")
Da.aa(20)
# 反射!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11
# 188888
# 20
# 而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。
# @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
class Goo(object):
__dazhe=0.5
def __init__(self,name,price):
self.name=name
self.__price=price
@property
def pr(self):
return self.__price*Goo.__dazhe
@classmethod # 把一个方法变成一个类中的方法 这个方法直接可以被调用 不需要依托任何对象 意思就是不实例化对象 还可以操作
def change_dazhe(cls,new_dazhe): # 修改打折价钱
cls.__dazhe=new_dazhe
print(cls.__dazhe,"打折")
print(new_dazhe)
a=Goo("西瓜",6)
print(a.pr)
Goo.change_dazhe(0.2)
print(a.pr)
# 3.0
# 0.2 打折
# 0.2
# 1.2000000000000002
# 当这个方法的操作只涉及静态属性的时候 就应该使用classmethod来装饰这个方法
# 类方法有一个默认参数 cls 代表这个类
# 只执行类的方法 不跟任何实例化捆邦 只跟类捆绑这个叫类方法 用@classmethod
""" 描述
classmethod 修饰符对应的函数不需要实例化,不需要 self 参数
,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等 """
# @classmethod 这表示只供类使用的方法
class Room(object):
name1="张无忌来了哈哈"
def __init__(self,name,owner,width,length,height):
self.name=name
self.owner=owner
self.width=width
self.length=length
self.height=height
def cal_self(self):
# print('%s 住 的 面-%s总的面积是--------%s'%(self.owner,self.name,self.width*self.length))
return self.width*self.length
def test(self,name):
print("来自",self.name)
@classmethod
def test_call(cls,aa,bb): # cls 这个参数表示接受的是一个类名
print(cls)
print("我是------",cls.name1,aa,bb) # 用类调用类的属性 相当于: Room.name1
# 用类执行方法
print(Room.name1)
Room.test_call(10000000,66666666)
# <class '__main__.Room'>
# 我是------ 张无忌来了哈哈 10000000 66666666
3.@staticmethod
@staticmethod 静态方法使用场景 如果无需使用对象中封装的值 那么就可以使用该方法
# @staticmethod 静态方法使用场景 如果无需使用对象中封装的值 那么就可以使用该方法
class Fa(object):
def __init__(self,name):
self.name=name
def aa(self): # 这是实例化的方法 一个参数必须是self
print(self.name)
@staticmethod #@staticmethod 这是个静态方法 可以不用传参数 参数也可有可无
def run():
print("我是静态方法---")
v=Fa("张三")
v.aa()
v.run() # 静态的方法也可以 对象调用
Fa.run() # 静态的方法也可以 类来调用 推荐这样调用
# 张三
# 我是静态方法---
# 我是静态方法---
print("****************************************************************************")
class Fa(object):
def __init__(self,name):
self.name=name
def aa(self): # 这是实例化的方法 一个参数必须是self
print(self.name)
@staticmethod #@staticmethod 这是个静态方法 可以不用传参数 参数也可有可无
def run(aa):
print("我是静态方法---",aa)
v=Fa("李四")
v.aa()
v.run("啦啦啦啦啦啦啦") # 静态的方法也可以 对象调用
Fa.run("哈哈哈哈哈哈哈") # 静态的方法也可以 类来调用 推荐这样调用
# 李四
# 我是静态方法--- 啦啦啦啦啦啦啦
# 我是静态方法--- 哈哈哈哈哈哈哈
python staticmethod 返回函数的静态方法。
class C(object):
@staticmethod
def f():
print('runoob');
C.f(); # 静态方法无需实例化
cobj = C() # 也可以实例化后调用
cobj.f()
# runoob
# runoob
class Login(object):
def __init__(self,name,pwd):
self.name=name
self.pwd=pwd
def log(self):
print("登陆了啊哈哈哈啊哈哈")
@staticmethod
def get_massage():
user=input("用户:")
pwd = input("密码:")
Login(user,pwd)
print("1111111111111")
Login.get_massage()# 如果一个函数 既和对象没有关系 也和类没有关系 那么就用 @staticmethod 将这个函数变成一个静态方法关联起来
aa=Login("aa",1)
aa.get_massage()
# 注意静态方法啊没有默认参
@staticmethod @ classmethod @property
# 只执行类的方法 不跟任何实例化捆邦 只跟类捆绑这个叫类方法 用@classmethod
""" 描述
classmethod 修饰符对应的函数不需要实例化,不需要 self 参数
,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等 """
# @classmethod 这表示只供类使用的方法
class Room(object):
name1 = "张无忌来了哈哈"
def __init__(self, name, owner, width):
self.name = name
self.owner = owner
self.width = width
@property
def ger(self):
print("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
def test(self, name):
print("来自", self.name1,"11111111111-------",name)
@classmethod
def test_call(cls, aa, bb): # cls 这个参数表示接受的是一个类名
print(cls)
print("我是------", cls.name1, aa, bb) # 用类调用类的属性 相当于: Room.name1
@staticmethod
def call(a, b, c):
print("正在吃饭-----------", a, b, c)
Room.call("张三", "年龄", "255")
print("*****************11********************")
Room.test_call(888,9999)
print("******************22*******************")
aa=Room("李四",88888,000000)
print("******************33*******************")
aa.test("哈哈哈")
print("******************44*******************")
# @property
aa.ger
# 正在吃饭----------- 张三 年龄 255
# *****************11********************
# <class '__main__.Room'>
# 我是------ 张无忌来了哈哈 888 9999
# ******************22*******************
# ******************33*******************
# 来自 张无忌来了哈哈 11111111111------- 哈哈哈
# ******************44*******************
# aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
#
# @staticmethod 静态方法是名义上的归属管理,不能使用变量和实例化变量 是类工具包
# 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。
# 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。
# 这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。
# 既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢
来源:https://www.cnblogs.com/Sup-to/p/10884275.html