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)

 

posted @ 2023-07-27 17:37  尼古拉-卡什  阅读(22)  评论(0编辑  收藏  举报