python - 类属性和类方法

类是一个特殊的对象
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

猜你喜欢

转载自blog.csdn.net/weixin_43067754/article/details/85344852
今日推荐