属性
属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理.
@property ***
@属性名.setter **
@属性名.deleter *
#属性的初识
class Person:
def __init__(self,name,hight,weight):
self.name = name
self.__hight = hight
self.__weight = weight
@property
def bmi(self):
return '%s 的bmi 值%s' %(self.name,self.__weight / self.__hight ** 2)
p1 = Person('大阳哥',1.68,70)
print(p1.bmi()) #原来的执行方法
print(p1.bmi) #添加@property之后的执行方法,不用加括号
#属性:在类中将一个方法,伪装成一个属性,在代码的级别上没有本质的提升,但是让其看起来跟合理.
# 属性的改
class Person:
def __init__(self,name,age):
self.name = name
if type(age) is int:
self.__age = age
else:
print( '你输入的年龄的类型有误,请输入数字')
@property
def age(self):
return self.__age
@age.setter
def age(self,a1):
'''判断,你修改的年龄必须是数字'''
if type(a1) is int:
self.__age = a1
else:
print('你输入的年龄的类型有误,请输入数字')
@age.deleter
def age(self):
del self.__age
p1 = Person('帅哥',20)
print(p1.age)
print(p1.__dict__)
p1.age = 23 #出现这个,立即执行@age,setter
print(p1.age)
del p1.age #出现这个,立即执行@age.deleter
# property : 类似于bmi这种,area,周长.... ***
# @age.setter **
# @age.deleter *
04 类方法
@classmethod
只能有类名调用(对象调用,传给cls参数的也是该对象的所属类).
使用场景:
1,无需对象参与.
2,对类中的静态变量进行修改.
3,在父类中类方法得到子类的类空间,为所欲为.
05 静态方法
@staticmethod
1,代码块.清晰.
2,复用性.
类方法 class A: def func(self): # 普通方法 print(self) @classmethod # 类方法 def func1(cls): print(cls) a1 = A() a1.func() A.func(a1) 类方法: 通过类名调用的方法,类方法中第一个参数约定俗称cls,python自动将类名(类空间)传给cls. A.func1() a1 = A() a1.func1() # 对象调用类方法,cls 得到的是类本身. 类方法的应用场景: 1, 类中 有些方法是不需要对象参与. class A1: name = 'alex' count = 1 @classmethod def func1(cls): # 此方法无需对象参与 return cls.name + str(cls.count + 1) A.func1(111) 不可取 a1 = A() print(a1.func1()) print(A.func1()) 2, 对类中的静态变量进行改变,要用类方法. 3,继承中,父类得到子类的类空间. class A: age = 12 @classmethod def func1(cls): # 此方法无需对象参与 # print(cls) # 对B类的所有的内容可以进行修改. print(cls.age) # return cls.name + str(cls.count + 1) class B(A): age = 22 B.func1() 不通过类方法,想让我的父类的某个方法得到子类的类空间里面的任意值. class A: age = 12 def func2(self): print(self) # self 子类的对象,能得到子类 空间的任意值 class B(A): age = 22 b1 = B() b1.func2() # 静态方法: class A: @staticmethod def login(username, password): if username == 'alex' and password == 123: print('登录成功') else: print('登录失败...') A.login('alex',1234) # def login(username,password): # if username == 'alex' and password == 123: # print('登录成功') # else: # print('登录失败...') # # login('alex',1234) # 1,代码块.清晰. # 2,复用性.
补充:
# python2x python3x区别
#源码不一样
Python2x: 各种按照自己代码的习惯给python贡献源码:(java的源码的习惯,C#源码的习惯),导致:源码混乱,重复代码高.
python3x:龟叔重写.源码 优美,清晰,简单.
1,python2x : print() print range()--->[1,2,3] raw_input() input(数字) 等等
1,python3x : print() range() 可迭代对象 input() 等等