属性,类方法,静态方法,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() 等等