类是一个特殊的对象
Python中一切皆对象
class AAA: 定义的类属性属于类对象
obj1 =AAA: 属于实例对象
在运行程序时,类 同样会被加载到内存
在python中,类 是一个特殊的对象–类对象
在程序运行时,类对象(模板) 在内存中之有一份,使用一个类(模板)可以创建出很多个对象实例
除了封装 实例 的属性和方法外,类对象还可以有自己的属性和方法
1.类属性
2.类方法
通过 类名. 的方式可以直接访问类的属性或者调用类的方法
类方法需要用修饰器@classmethod来标示,告诉解释器这是一个类方法
类方法的第一个参数应该是cls
由哪一个类调用的方法,方法内的cls就是哪一个类的引用
这个参数和实例方法的第一个参数是self类似(哪一个对象调用的方法,self就是哪一个对象的引用)
通过类名调用类方法,调用方法时,不需要传递cls参数
在方法内部
也可以通过cls.访问类的属性
也可以通过cls.调用其他的类方法
需求:定义一个工具类
每件工具都有自己额名字
需要知道使用这个类,创建了多少个工具对象
class Tool(object):
# 1.使用赋值语句定义类属性,记录所有工具的数量
count = 0
def __init__(self,name):
self.name = name
# 让类属性的值 +1
Tool.count += 1
# 创建工具对象(对象在创建的时候,会自动调用初始化方法)
print(Tool.count)
tool1 = Tool('斧头')
tool2 = Tool('榔头')
# 使用 类名.属性名 的方式来获取属性名
print(Tool.count)
输出:
0
2
@classmethod 告诉解释器这是一个类方法
class Tool(object):
# 1.使用赋值语句定义类属性,记录所有工具的数量
count = 0
def __init__(self,name):
self.name = name
# 让类属性的值 +1
Tool.count += 1
@classmethod
def show_tool_count(cls):
# cls.count 在类方法内部,访问当前的类属性
print('工具对象的数量 %d' %(cls.count))
# 创建工具对象(对象在创建的时候,会自动调用初始化方法)
tool1 = Tool('斧头')
Tool.show_tool_count()
# 输出工具对象的属性
输出:
工具对象的数量 1
静态方法:
class Cat(object):
@staticmethod
def call():
print('喵~')
# 不需要创建对象,直接就可以使用
Cat.call()
输出:
喵~
需求:
输入年/月/日 输出 年 月 日 并且判断格式正误
class Date(object):
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day
# 实例方法(默认情况下会传递对象给echo方法)
def echo(self):
print('%s %s %s' %(self.year,self.month,self.day))
# 默认传递类本身给这个方法
@classmethod
def as_string(cls,s):
#print(cls)
month,day,year = s.split('/')
d = cls(year,month,day) # d = Date(2018,10,10)
return d
@staticmethod
def is_vaild(s):
# 批量将年月日转换成整型
# month,day,year = s.split('/')
# month,day,year = [int(i) for i in s.split('/')]
month,day,year = map(int,s.split('/'))
return 0<month<=12 and 0<day<=31 and 1<year< 9999
d = Date(2018,10,10)
print(d)
d.echo()
输出:
<__main__.Date object at 0x7fe4ac2495c0>
2018 10 10
class Date(object):
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day
# 实例方法(默认情况下会传递对象给echo方法)
def echo(self):
print('%s %s %s' %(self.year,self.month,self.day))
# 默认传递类本身给这个方法
@classmethod
def as_string(cls,s):
#print(cls)
month,day,year = s.split('/')
d = cls(year,month,day) # d = Date(2018,10,10)
return d
@staticmethod
def is_vaild(s):
# 批量将年月日转换成整型
# month,day,year = s.split('/')
# month,day,year = [int(i) for i in s.split('/')]
month,day,year = map(int,s.split('/'))
return 0<month<=12 and 0<day<=31 and 1<year< 9999
s = '10/10/2018'
print(Date.as_string(s).echo())
print(Date.is_vaild(s))
输出:
2018 10 10
None
True
class Date(object):
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day
# 实例方法(默认情况下会传递对象给echo方法)
def echo(self):
print('%s %s %s' %(self.year,self.month,self.day))
# 默认传递类本身给这个方法
@classmethod
def as_string(cls,s):
#print(cls)
month,day,year = s.split('/')
d = cls(year,month,day) # d = Date(2018,10,10)
return d
@staticmethod
def is_vaild(s):
# 批量将年月日转换成整型
# month,day,year = s.split('/')
# month,day,year = [int(i) for i in s.split('/')]
month,day,year = map(int,s.split('/'))
return 0<month<=12 and 0<day<=31 and 1<year< 9999
d = Date(2018,10,10)
print(d.is_vaild('13/10/2019'))
输出:
False