2020-10-11 Python: 类
2020-10-11 本文已影响0人
MJades
Define Class
class Employee:
raise_amt = 1.04 # 实参:无需在创建对象时传递
# self会自动向下传递,无需在创建类的时候进行传递;而first, last, pay需在创建对象时进行传递;
def __init__(self, first, last, pay): # 均为形参
self.first = first
self.last = last
self.email = first + '.' + last + '@email.com'
self.pay = pay
# 字符串的format函数可以接受不限个参数,位置可以不按顺序,可以不用或者用多次;
def fullname(self):
return '{} {}'.format(self.first, self.last)
def apply_raise(self):
self.pay = int(self.pay + self.raise_amt)
return self.pay
根据类来创建对象
emp_1 = Employee('Corey', 'Schafer', 50000)
1. 调用类中的方法
Employee.fullname(emp_1)
Employee.apply_raise(emp_1)
2. 调用类的属性:通用属性
emp_1.raise_amt
emp_1.first
3. 修改属性的值
method 1: 直接修改
emp_1.raise_amt
emp_1.raise_amt=2
emp_1.raise_amt
method 2: 通过方法修改属性的值
class Employee:
raise_amt = 1.04 # 实参:无需在创建对象时传递
# self会自动向下传递,无需在创建类的时候进行传递;而first, last, pay需在创建对象时进行传递;
def __init__(self, first, last, pay): # 均为形参
self.first = first
self.last = last
self.email = first + '.' + last + '@email.com'
self.pay = pay
# 字符串的format函数可以接受不限个参数,位置可以不按顺序,可以不用或者用多次;
def fullname(self):
return '{} {}'.format(self.first, self.last)
def apply_raise(self):
self.pay = int(self.pay + self.raise_amt)
return self.pay
def update_raise_amt(self,new):
self.raise_amt = new
emp_1 = Employee('Corey', 'Schafer', 50000)
emp_1.raise_amt
emp_1.update_raise_amt(2)
emp_1.raise_amt
继承
一个类继承另外一个类时,将自动获得另一个类的所有属性与方法,还可以定义自己的属性与方法, 原来的类为父类,新的类为子类;
For example: Employee是父类,在()内定义who是父类:
super()是一个特殊的函数,帮助Python将父类与子类关联起来, 这个函数让Python调用Son的父类的方法init(),让Son实例包含父亲的所有属性。
1. 给子类定义属性和方法
class Son(Employee):
# __init__里super()函数将父类与子类关联起来,调用父类的__init__()
def __init__(self, first, last, pay):
super().__init__(first, last, pay)
self.sex = "F" # 子类特有的属性
# 定义子类的方法
def add(self,age):
return 'Age: '+age
new = Son("a","c",200)
调用子类中的方法
new.add('28')
2. 重写父类中的方法:当父类中方法不符合子类时,可以在子类中用和父类相同的函数名对父类中的函数进行重写
class Son(Employee):
# __init__里super()函数将父类与子类关联起来,调用父类的__init__()
def __init__(self, first, last, pay):
super().__init__(first, last, pay)
self.sex = "F" # 子类特有的属性
# 定义子类的方法
def add(self,age):
return 'Age: '+age
# 重写父类中的函数fullname
def fullname(self):
return "{}-{}".format(self.last, self.first)
new = Son('Corey', 'Schafer', 50000)
Son.fullname(new)
new.add("90")
- 若没有额外的传递参数(即:除self之外,没有其他形参),则Son.fullname(new),类名.函数名(实例);
- 若有额外的形参,则不需要写类名,实例.函数名(传递形参)。
3. 将实例作为属性
当对类添加的细节过多时,可以将具体的一些细节分离出来,形成实例的类,然后可以在类中将实例作为属性
# 实例
class Lina():
def __init__(self, name= 'Lulu'):
self.name = name
def nickname(self):
print("The nickname of Lina is Lulu")
class Son(Employee):
# __init__里super()函数将父类与子类关联起来,调用父类的__init__()
def __init__(self, first, last, pay):
super().__init__(first, last, pay)
self.sex = "F" # 子类特有的属性
self.nickname = Lina() # 以实例为属性
# 定义子类的方法
def add(self,age):
return 'Age: '+age
new = Son('Corey', 'Schafer', 50000)
new.nickname.nickname() # 调用实例中的详细描述,即方法
导入、调用类
%run employee.ipynb
emp_1 = Employee('Corey', 'Schafer', 50000)
emp_1.raise_amt