Python基础到进阶之01类函数、实例函数和静态函数

python是一门非常简单容易上手的语言,博主使用了一年多python,但是明确知道自己对python的很多特性还是不是非常了解,很多细节都没把握,甚至很多看不懂不知道的地方
github上python100days项目 让我想再学一遍python,查缺补漏一下,此系列博客用来记录和分享



#python中的类有三种方法,类方法,实例方法,和静态方法
# 实例方法就是新建一个实例之后,可以调用的对象里的方法,这点和java、c等语言中类或者对象的方法非常类似,方法第一个参数为self
# 类方法是指访问类属性的方法,默认第一个参数为cls,@classmethod
# 静态方法没有第一个隐参,可以被直接调用,@staticmethod

# 01静态方法
class Person(object):

# 限定Person对象只能绑定_name, _age和_gender属性,height无法动态绑定 去掉__slot__之后就可以绑定了
__slots__ = ('_name', '_age', '_gender')

def __init__(self, name, age):
self._name = name
self._age = age

@property
def name(self):
return self._name

@property
def age(self):
return self._age

@age.setter
def age(self, age):
self._age = age

def play(self):
if self._age <= 16:
print('%s正在玩飞行棋.' % self._name)
else:
print('%s正在玩斗地主.' % self._name)

@staticmethod
def printa():
print("a")

@classmethod
def new(cls,age):
return cls("xiaoliu",age)

# 加装饰器的原因就是为了对于实例也可以调用这个fun,如果没加@staticmethod,不实例化可以调用printa但是实例之后无法调用
# 因为实例需要fun中传入self
@staticmethod
def is_valid(a, b, c):
return a + b > c and b + c > a and a + c > b

if __name__ == '__main__':
print(Person.is_valid(1, 2, 3))
Person.printa()
person = Person('xiaoliu',22)
person.printa()
# person._gender="famale"
# person.height=168


# 02 实例方法,第一个参数通常为self,表示实例相关信息的对象,实例对象可以调用实例方法,类不可以调用实例方法,因为需要实例化
#可以调用
person.play()
#类不可以调用实例方法
# Person.play()

# 03 类方法,类方法的第一个参数约定名为cls,它代表的是当前类相关的信息的对象
#类方法可以帮助生成类,例子中通过类方法直接确定人名是xiaoliu,年纪可以通过类方法设定,再新建出实例
person2 = Person.new(52)
print(person2.name, person2.age)

person2.new(22)
print(person2.name, person2.age)
#类方法可以被类直接调用,也可以被实例对象直接调用,上述语句 person2.new(22) 没有报错就证明实例也可以调用类函数,但是xiaoliu的
#年纪会变吗?答案是不会,因为返回的cls("xiaoliu",age)不会对应到某个实例

person3= person2.new(22)
print(person3.name, person3.age)
# 这下person3的age会是多少呢,答案是22,因为返回的cls信息,用来实例化一个新的实例3
posted @ 2019-08-16 19:09  Cooper_Xia  阅读(323)  评论(0编辑  收藏  举报