Python面向对象编程-学习笔记(一)
课程地址:https://www.bilibili.com/video/BV1qm4y1L7y1/
1. Pass占位符
新建类后如果暂时不确定如何实现,可用pass占位
2.构造函数,属性
# Python Object-Oriented Programming class Employee: def __init__(self, first, last, pay):
#构造函数,第一个参数必须是self self.first= first
#新添加属性 self.last = last self.pay=pay self.email = first +'.'+ last+'@company.com
def GetFullName(self):
#此处必须传入self参数,表示需要引用实例化对象
#否则在调用该方法(①)时会引发"GetFullName takes 0 posional arguments but 1 was given"
#这是因为调用类的实例的方法时,实例会被自动传递到方法中,如果方法没有self则会报错
return '{} {}'.format(self.first,self.last)
emp_1 = Employee('Corey','Schafer', 50000) emp_2 = Employee('Test','User', 60000) # print(emp_1) # print(emp_2) print(emp_1.email) print(emp_2.email)
print('{} {}'.format(emp_1.first,emp_1.last))
#一种字符串格式化方法
print(emp_2.GetFullName())①
Employee.GetFullName(emp_1)
#另一种调用类中方法的方式
3.类的变量
1 class Employee: 2 raise_amount =1.04
num_of_emps=0
#定义类的变量 3 def __init__(self, first, last, pay): 4 self.first = first 5 self.last = last 6 self.pay= pay 7 self.email = first + '.' + last + '@company.com'
Employee.num_of_emps+=1
#此处不能用self,因为属于整个类,而非某个实例 8 def fullname(self): 9 return '{} {}'.format(self.first, self.last) 10 def apply_raise(self): 11 self.pay = int(self.pay * Employee.raise_amount)
#类的变量的调用需要引用类名或实例名(self),否则报错未定义raise_amount
#self.pay = int(self.pay * self.raise_amount)#另一种写法
print(Employee.num_of_emps) #值为0 13 emp_1=Employee('Corey','Schafer', 50000) 14 emp_2= Employee('Test','User', 60000) 15 print(emp_1.pay)
print(Employee.num_of_emps) #值为2
print(emp_1.__dict__) #打印实例的属性字典,不包含raise_amount变量
print(Employee.__dict__) #打印类的属性字典,包含raise_amount变量
emp_1.raise_amount =1.05 #只影响emp_1实例
Employee.raise_amount=1.06 #影响所有实例
4.方法(常规方法、类方法、静态方法)
class Employee:
raise_amount =1.04 def __init__(self, first, last, pay): self.first = first self.last = last self.pay= pay self.email = first + '.' + last + '@company.com'
def fullname(self): #普通方法,自动将类的实例self作为第一个参数
return '{} {}'.format(self.first, self.last)
@classmethod #类方法的装饰器,自动将类作为第一个参数
def set_raise_amount(cls,amount):
cls.raise_amount=amount
@classmethod
def from_string(cls,emp_str):
first,last,pay=emp_str.split('-')
return cls(first,last,pay) #cls代表本类
@staticmethod #静态方法,无需将类或实例作为参数传入
def is_workday(day):
if day.weekday()==5 or day.weekday==6:
return False
return True
#调用类方法修改类变量,而不是修改的实例变量
Employee.set_raise_amount(1.05)
#emp_1.set_raise_amount(1.05)作用相同,仍然修改了类变量,但很少这么使用
emp_str1='John-Doe-70000'
new_emp=Employee.from_string(emp_str1)
#当需要使用类的方法代替类的构造方法时,通常用到类方法,
#本例中不必用户自己解析字符串了
import datetime
my_date=datetime.date(2018,7,9)
print(Employee.is_workday(my_date)