核心语法-python–Class语法01

#1、类的定义

class 类名(继承类):

**语句块(又称为“类体”,包括类成员定义、属性和方法)**

其中,
class —关键字,表示定义类的开始
继承类 —又被称为“基类”,可以为一个或多个,是类的父亲。在一般情况下,如果每天合适的继承类,则常使用object类,这是所有类最终均将继承的基类。
换言之,object是所有类的父亲。
类名 —可以任取,只要符合标识符命名规则即可,通常首字符采用大写形式,以有别于其他函数或方法,用于表示它是类名。
语句块(类体) —定义该类属性和方法的具体代码。如果语句块为空,则建议使用 pass 。这是Python强烈建议的,因为Python语言没有类似C、C++语言中的空语句“;”,语句 pass 是Python语言中的空语句,它有三个功能:代表空语句(do nothing);保证格式完整;保证语义完整。

#2、类定义的举例
#举例1:定义一个学生类1

class student(object):
    pass

上述代码定义了一个名为“student”的类,只不过它既无属性,也无方法,所以它是一个空类,它的父类是object

class Student:
    pass

上述代码同样定义了一个名为"Student"的类。在Python3 中,在类名后如果省略“(object)”,则Python解释器将自动补上它。上述两个类其实是一样的,空类。

#举例3:向空类创建的实例添加属性

class Student(object):
    pass

#实例化

st1 = Student()       #通过Student()产生一个实例  (对象st1)
#给实例添加属性
st1.name = "马云"   #设置实例的属性name
st1.age = 18       #设置实例的属性age
print(st1.name)    #显示实例的属性
print(st1.age)

#实例化2

st2 = Student()
print(st2.name) #没有添加属性,所以错误!

"""
Traceback (most recent call last):
  File "D:/Python/pycharm/pycharm_code/Class_Python.py", line 47, in <module>
    print(st2.name)
AttributeError: 'Student' object has no attribute 'name'
"""

上述的类,在定义类时没有添加类的属性,而是在类外添加属性。对实例化的类,添加属性,对实例才有效。不添加属性,该实例就没有这个属性。

#定义一个游戏玩家类(Gamer)

class Gamer(object):

    """
    游戏类玩家

    #这一块是类的文档字符串,用于对类进行说明。可用于“类名.__doc__”访问。  可写可不写,建议写上,便于理解代码
    """
    #构造函数,对类的实例进行初始化
    def __init__(self,number,name,sex):
        self.name = name
        self.number = number
        self.sex = sex
        self.score = 0
    """
    def __init__(self)模块:
        类的初始化方法,相当于其他语言中的构造函数;
        用于对类的实例进行初始化,在创建实例时被自动调用,用于设置所有实例的属性;
        第一个参数必须是self ,其他参数取决于类的需要;
        可选,但通常必须有。该方法不能有 return 语句
    """
    #开始游戏方法
    def start_game(self):
        print("{}开始游戏...".format(self.name))

    #实例计分方法
    def add_score(self,score):
        self.score += score

    #获取实例得分方法
    def get_score(self):
        return self.score
"""
上述是类的实例方法
用于设置实例的属性和行为;
第一个参数必须为self.其他参数取决于类的需要;
方法数量不限,可根据需要确定。例如,本例有3个实例方法;
方法的本质就是函数,与函数有关的语法均适用于方法,如默认参数、关键词参数、列表和字典参数、不定长参数等。
"""

“”"
上述Gamer类的继承类(父类)为object,它是系统默认的基类。该类目前定义了4个实例属性:name、number、sex和score,
分别用于设置每个实例的姓名、编号、性别和得分。
该类定义了3个实例方法:start_game()、add_score()和get_score(),分别用于实现启动游戏、计分和获取得分3个行为。
类的方法主要用于设定实例的行为。方法的第一个参数必须是self,表示实例本身,但在调用时,不需要传递该参数。
“”"

#init()方法

init()方法又被称为“构造函数”,有以下四个特性。
(1)该方法很特殊。init前后均有双下划线“__”,它的第一个参数必须是self ,其意义同其他方法一样,而其他参数用于设置实例的属性,数量不限。 该方法不能使用 return。
(2)init()方法可在类中的任何位置被定义。
(3)在由类创建一个新的实例时,该方法被自动调用一次。即每创建一个实例,该方法都会被调用一次。
(4)常用该方法定义实例的属性,但定义实例的属性不局限于该方法。换言之,在其他方法中同样可以定义实例的属性。

class Gamer(object):
    """
    游戏玩家类
    某某某
    """
    top_score = 0  #类变量,保存历史最高分
    games = 0 #玩家数量
    """
    #类的变量。它是静态变量
    #用于对类的有关共有属性进行设置,由类引用
    #类内、外均可用,引用方法:类名.变量名
    """
    #静态方法
    @staticmethod
    def show_help():  #不需要类变量和实例变量的方法
        print("这是一个猜数的小游戏(1-100整数)")
        print("可以同时有三个玩家")
        print("谁最接近,谁得分最高")
        print("准确则得10分")
        print("误差早10%以内得8分,20%得6分")
        print("误差在30%以内得5分,否则不得分")
    """
    类的方法。属于类,由类引用
    在方法定义的前一行,通过装饰符@staticmethed声明,表面接下来定义的方法为静态方法;
    参数可选。没有隐性传入参数
    类内、外均可引用。类和实例均可引用
    """
    #类方法
    @classmethod
    def show_top_score(cls):  #显示历史最高分
        print("游戏最高分是%d"%cls.top_score)
    @classmethod
    def show_games(cls):      #显示游戏玩家数
        print("游戏玩家总 %d 人"%cls.games)
    """
    类的方法
    第一个参数必须是cls。其他产参数取决于类的需要;
    类内、外均可引用。类和实例均可引用
    """
    #构造函数
    def __init__(self,number,name,sex):
        self.name = name   #实例属性:姓名 name
        self.number = number   #实例属性:编号 number
        self.sex = sex  #实例属性:性别  sex
        self.score = 0 #实例属性: 得分 score
        Gamer.games += 1  #游戏玩家数量 +1

    #开始游戏方法
    def start_game(self):
        print("{}开始游戏...".format(self.name))

    #实例计分方法
    def add_score(self,score):
        self.score += score

    #获取实例得分方法
    def get_score(self):
        return self.score
"""
上述三个实例方法
类的实例方法
第一个参数必须是self。其他参数取决于类的需要;
类内、外引用。只能实例引用;
类内引用:self.方法
类外引用:实例.方法
"""
"""
类变量--静态变量
属性变量--动态变量
一般变量--动态变量,某个方法内的 中间变量
类方法、静态方法、实例方法
"""
"""
实例调用与类调用
有参数方法和无参数方法
"""
#定义一个类
class Student(object):
    def __init__(self,name,sex,year):
        self.name = name
        self.sex = sex
        self.year =year

    def show(self):
        print(self.name)
        print(self.sex)
        print(self.year)

    def demo():
        print("我没有参数,实例不能调用我哦!")

st1 = Student("shenhw","M",46)  #创建实例
st1.show()  #实例调用有参数方法,正常
#st1.demo()  #实例调用无参数方法,异常,会报错
Student.demo() #类直接调用无参数方法,正常

类方法及其装饰符–@classmethod @staticmethod

“”"
@classmethod是一个函数装饰符,用它装饰的方法不是实例方法,而是类方法。类方法只能被类调用,而不能被实例调用,常被用于方法重载。
类方法的第一个参数必须是cls,表示类本身;而实例方法的第一个参数是self,表示该类的一个实例。当类由子类继承时,在调用类方法时,传入的类变量cls
的实际参数是子类,而非父类。对于类方法既可由类调用,也可以由类的实例调用。
假设类方法有n个形参,如果由类调用它,则需要传递的实际参数只能为n-1个,第一个参数默认为类本身;如果由实例调用它,则需要传递的实际参数为n个。
@staticmethod也是一个函数装饰符,用它装饰的方法是静态方法。静态方法属于类方法,不是实例方法,可将它理解成全局函数,因此可被类或类的实例调用。
在调用时,他不会被隐式地传入任何参数。也就是说,静态方法可以没有任何参数。
由于静态方法无内定的隐性参数,所以调用静态方法时的实际参数必须与形参个数一致。
一般而言,如果一个方法需要要使用self参数,它就适合被定义为静态方法。