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")
  1. 若没有额外的传递参数(即:除self之外,没有其他形参),则Son.fullname(new),类名.函数名(实例);
  2. 若有额外的形参,则不需要写类名,实例.函数名(传递形参)。

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

End

上一篇下一篇

猜你喜欢

热点阅读