关于面向对象和面向过程
类的定义
class Student: #类名一般首字母大写,多个单词采用驼峰原则
def __init__(self,name,age): #self必须位于第一个参数
self.name = name
self.age = age
def say_score(self):
print("name:{0},age:{1}".format(self.name,self.age))
s1 = Student("jiaqi",18)
s1.say_score()
#输出
name:jiaqi,age:18
构造函数__init__()?
def __init__(self,name,age): #self必须位于第一个参数
self.name = name
self.age = age
实例属性
Python中,类中的变量又叫属性,类中的函数又叫方法。? 可见,属性只是一个变量,只是它存在于类的内部;方法就是一个函数,它同样存在于类的内部。 要点: 1、定义实例方法时,第一个参数必须为self,和前面一样,self指当前的实例对象 2、调用实例方法时,不需要也不能给self传参,self由解释器自动传参 函数和方法的区别 1、都是用来完成一个功能的语句块,本质一样 2、方法调用时,通过对象来调用,方法从属于特定实例对象,普通函数没有这个特点 3、直观上看,方法定义时需要传递self,函数不需要 其他操作: 1、dir(obj)可以获得对象的所有属性、方法 2、obj__dict__ ?对象的属性字典 3、pass 空语句 4、isinstance(对象、类型) ?判断“对象”是不是“指定类型”
类方法 格式: @classmethod ? def ? 类方法名(cls ? [,形参列表]): ? ? ? ?函数体
要点如下: 1、@classmethod 必须位于方法上面一行 2、第一个cls必须有:cls指的就是“类对象本身” 3、调用类方法格式:“类名.类方法名(参数列表)”,参数列表中,不需要也不能给cls传值 4、类方法中访问实例属性和实例方法会导致错误 5、子类继承父类方法时,传入cls是子类对象,而非父类对象 ?
class Student:
name="jiaqi" #类属性
@classmethod #类方法
def printName(cls):
print(cls.name)
Student.printName() #方法调用
静态方法 格式如下; @staticmethod def ?静态方法名(【形参列表】): ? ? ? ? 函数体 要点如下: 1、@staticmethod ?必须位于方法上面一行 2、调用静态方法格式:“类名.静态方法名(参数列表)” 3、静态方法中访问实例属性和实例方法会导致错误
class Student:
name="jiaqi" #类属性
age=19
@staticmethod #静态变量
def sum(a,b):
print("{0}+{1}={2}".format(a,b,(a+b)))
return a+b
Student.sum(3,4)
__del__方法(析构函数)和垃圾回收机制
class Student:
def __del__(self):
print("销毁对象{0}".format(self))
p1=Student()
p2=Student()
del p2
print("程序结束")
#输出
销毁对象<__main__.Student object at 0x000001F9F8BE4790>
程序结束
销毁对象<__main__.Student object at 0x000001F9F8BE5390> #先销毁p2,再销毁p1
__call__方法和可调用对象 定义了__call__方法的对象,称为“可调用对象”,即对象可以像函数一样被调用
class salary:
def __call__(self,salary):
yearSalary = salary*12
daySalary = salary//12
houseSalary = daySalary//30
return dict(yearSalary=yearSalary,salary=salary,daySalary=daySalary,houseSalary=houseSalary)
t = salary()
print(t(3000))
#输出
{'yearSalary': 36000, 'salary': 3000, 'daySalary': 250, 'houseSalary': 8}
私有属性和私有方法 1、通常我们约定,两个下划线开头的属性是私有制(private),其他为公有制(public) 2、类内部可以访问私有属性(方法) 3、类外部不能直接访问私有属性(方法) 4、类外部可以通过“_类名__私有属性(方法)名”访问私有属性(方法)
class employee:
def __init__(self,name,age):
self.name = name
self.__age = age #私有属性
def __work(self): #私有方法
print("good good study,day day up")
t = employee("jiaqi",18)
print(t.name)
print(t._employee__age)
t._employee__work()
#输出
jiaqi
18
good good study,day day up
@property 装饰器 ? get与set
class employee:
def __init__(self,name,salary):
self.__name = name
self.__salary = salary
def get_salary(self):
return self.__salary
def set_salary(self,salary):
if 1000<salary<500000:
self.__salary = salary
else:
print("输入错误")
s1=employee("jiaqi",3000)
print(s1.get_salary())
print(s1.set_salary(2))
3000
输入错误
None
class employee:
def __init__(self,name,salary):
self.__name = name
self.__salary = salary
@property
def salary(self):
return self.__salary
@salary.setter
def salary(self,salary):
if 1000<salary<500000:
self.__salary = salary
else:
print("输入错误")
s1=employee("jiaqi",3000)
print(s1.salary)
s1.salary=2
print(s1.salary)
3000
输入错误
3000
继承
class Student:
def __init__(self,name,age):
self.name=name
self.__age=age
def say_name(self):
print(self.name,self.age)
class Person(Student):
def __init__(self,name,age,score):
Student.__init__(self,name,age)
self.score=score
s=Person("jiaqi",18,100)
print(dir(s))
print(s._Student__age)
print(s.score)
['_Student__age', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say_name', 'score']
18
100
重写__str__()方法
用于返回一个对于“对象的描述”,对应于内置函数str()经常用于print()方法
组合调用
class MobilePhone:
? ? def __init__(self,cpu,screen):
? ? ? ? self.cpu = cpu
? ? ? ? self.screen = screen
class CPU:
? ? def calculate(self):
? ? ? ? print("这是一个可以计算的")
class Screen:
? ? def show(self):
? ? ? ? print("这是一个可以显示的屏幕")
a = MobilePhone(CPU(),Screen())
b = a.cpu.calculate()
c = a.screen.show()
|