1、定义类
class 类名[(父类列表)]:#(父类列表省略时默认继承object相当于java)
属性
方法
例如:
class student:
no = 0 # 可以直接定义属性,这是类的属性,由类的所有对象共享
name = '无名'
def __init__(self, no, name): # 创建实例对象时自动调用的方法
self.no = no # 实例对象的 no 属性,可以不需要事先定义,赋值即可。每个实例对象独享。
self.name = name # 实例对象的 name 属性,可以不需要事先定义,赋值即可。每个实例对象独享。
def show(self): # 类的 show() 方法
print(self.no, self.name, sep='\t')
'''
注意,定义类的方法时的 self 参数是对类的当前实例的引用,用于访问属于该类的变量。
通行的做法是将其命名为 self,但实际可以命名为其它名称,但它必须是类中任意函数的第一个参数。
如,以上 student 类的方法的第一个参数 self 也可以命名为 me 或 this。
'''
2、类对象的引用格式
类对象.属性或方法
print(s1.no) # 使用实例对象的 no 属性
s1.show() # 调用实例对象的 show() 方法,实例的方法对象,调用它时,默认第一个参数就是实例对象自身(即不用显式传递)。
###s1.show() 等价于 student.show(s1)。
3、类对象实例化格式
类名(参数列表)
s1 = student(10000, '张三') ###实例化
实例化操作("调用"类对象)会创建一个空对象。如果要创建带有特定初始状态的自定义实例,则类定义时可以包含
一个名为 __init__() 的特殊方法,在用类创建对象时就自动调用这个方法。
__init__() 函数可以在创建对象时将值赋给对象属性,或者执行其他的操作。
4、删除实例对象的属性del
4.1 使用 del 关键字:
s2 = student(10001, '王五') # 为观察同一类的其它实例对象而创建另一个实例对象
del s1.name
s1.show() # 由于 name 属性已删除,引发报错 AttributeError: 'student' object has no attribute 'name'删除实例对象属性只是对当前实例对象起作用,不影响同一类的其它实例对象。
print(s2.name) # s2 对象的 name 属性不受影响
4.2 还可以使用 del 关键字删除整个实例对象:
del s1
5、添加新属性
创建类定义中不存在的属性:
s1.sex = '男'
print(s1.sex)
新增的属性只限于当前实例对象,就象删除属性一样,新增属性丝毫不影响类及其其它实例对象。
6、如果类没有语句,可以使用 pass 代替:
class myclass:
pas
7、 类外定义函数
def foo(self):
return print(self.firstname, self.lastname)
class person:
show = foo # 类内的属性 show 引用外部定义的函数对象 foo
def __init__(self, fn, ln):
self.firstname = fn
self.lastname = ln
8、静态函数,即第一个参数不是类的实例对象的函数。静态函数使用 @staticmethod 装饰。
class myclass:
@staticmethod
def staticfunction():
print('This is static function')
静态函数无法访问实例对象的属性,因为不知道要访问哪一个实例;但可以访问类的变量(属性),因为那是共享的,
通过类对象即可访问。
可以通过 "类名.静态函数()" 来访问静态函数,也可以使用 "对象名.静态函数()" 来访问静态函数。
特点:静态函数其实就是个普通函数,主要用途是限定命名空间,即只有某个类才用,不适合模块级使用。
9、类函数
1、类函数,即第一个参数是类的函数。类函数使用 @classmethod 装饰。如:
class DateTest():
def __init__(self, year, month, day):
self.year = year
self.day = day
self.month = month
def print_date(self):
print("{}:{}:{}".format(self.year, self.month, self.day))
@classmethod
def get_date(cls, string_date):
year, month, day = map(int, string_date.split('-'))
return cls(year, month, day)
可以通过 "类名.类函数()" 来访问类函数,也可以使用 "对象名.类函数()" 来访问类函数。类函数主要用来作为构造函数。
10、继承
1、定义子类的格式是:
#
class 子类名(父类名列表):
属性
方法
#
定义人类,作为学生类的父类
class person:
def __init__(self, firstname, lastname):
self.firstname = firstname
self.lastname = lastname
def showname(self):
print(self.firstname, self.lastname)
定义学生类,继承人类:
class student(person):
pass
由于 student 类只有 pass 而没有其它代码,因此 student 类完全继承了 person 类的
属性和方法,并且由于没有添加新的属性和方法,因此拥有与 person 类相同的属性和方法。
s1 = student('刘', '德华')
s1.showname()
2、方法覆盖
student 类继承了其父类 person 类的 __init__() 方法,但可以为 student 类新增__init__() 方法,这样子类不再继承其父类的 __init__() 方法了。
class student(person):
def __init__(self, firstname, lastname): # 子类的 __init__() 方法覆盖了其父类的同名方法
self.firstname = firstname
self.lastname = lastname
s1 = student('刘', '德华')
s1.showname()
如果要继承父类的 __init__() 方法,可以在子类的 __init__() 方法中调用父类的 __init__() 方法。
class student(person):
def __init__(self, firstname, lastname): # 子类的 __init__() 方法覆盖了其父类的同名方法
person.__init__(self, firstname, lastname) # 调用父类的方法
s1 = student('刘', '德华')
s1.showname()
3、使用 super() 函数,可以使子类从其父继承所有方法和属性:
class student(person):
def __init__(self, firstname, lastname): # 子类的 __init__() 方法覆盖了其父类的同名方法
super().__init__(firstname, lastname) # 调用父类的方法
s1 = student('刘', '德华')
s1.showname()
4、子类可以添加新属性和方法:
class student(person):
def __init__(self, firstname, lastname, age): # 子类的 __init__() 方法覆盖了其父类的同名方法
super().__init__(firstname, lastname) # 调用父类的方法
self.age = age # 添加新属性
def show(self): # 添加新方法
print(self.firstname, self.lastname, self.age)
s1 = student('刘', '德华')
s1.show()
注意:如果在子类中添加一个与父类中的方法同名的方法,则将覆盖父类的方法。
另外,对于多继承的情况,如果多个父类中有同名的方法,则排在 "父类名列表" 中前面的类的方法会 "遮蔽"
后面的父类中的方法。