属性,类方法,静态方法,Python2和3方法
属性
属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理.
@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() 等等
浙公网安备 33010602011771号