面向对象
1)类与对象
(关键词:
对象 - object ,类 - class ,封装 - encapsulation ,继承 - inheritance ,多态 -polymorphism)
新建——python基础代码——面向对象——New—— File——命名
class Student
#定义了一个学生“类”,有定义方法
#如果在函数中,那么被称之为类方法
def study(self,course_name):
print(f'学生正在学习{course_name}')
def play(self):
print('学生正在玩游戏')
想要去调用当前类中的方法,首先需要对当前的类实例化,即“()”
2)初始化方法(给student类添加_init_方法)
class Studet:
#初始化方法.给当前对象创建属性
def__init__(self,name,age):
#给当前类添加属性
self.name=name
self.age=age
#以上初始化完成
def study (self,course_name):
#属性使用self进行调用 ,参数是直接调用
print(f'{self.name}正在学习{course_name}')
def play(self):
print(f{self.name}正在玩游戏')
#实例化类
stu1=Student('顾安',18)
stu1.study('Python 程序设计')
#顾安正在学习Python程序设计
3)打印对象(两个下划线_ _开头和结尾的方法,称为魔术方法或者魔法方法。)
class Studet:
#初始化方法.给当前对象创建属性
def__init__(self,name,age):
#给当前类添加属性
self.name=name
self.age=age
#以上初始化完成
def study (self,course_name):
#属性使用self进行调用 ,参数是直接调用
print(f'{self.name}正在学习{course_name}')
def play(self):
print(f{self.name}正在玩游戏')
#使用类中内置的魔术方法来实现
def __repr__(self):
return f'{self.name}:{self.age}'
#实例化类
stu1=Student('顾安',18)
#打印当前对象
print(stu1)
#顾安正在学习Python程序设计
4)可见性画完属性装饰器
(对象属性可设为私有(private)或受保护(protected))
通过给对象属性名添加前缀下划线的方式来说明属性可见性
例._ _name表示一个私有属性.
_name表示一个受保护属性.
class Student:
def _ _init_ _(self,name,age):
#创建私有属性
self._ _name=name
self._ _age=age
def study(self,course_name ):
print(f'{self._ _name}正在学习{course_name}')
stu=Student('顾安',18)
stu.study('Python程序设计')
#顾安正在学习Python程序设计
print(stu._ _name)
#系统报错,原因:'_ _name'
Python 并没有从语法上保证私有属性的私密性,可通过方法访问。
即 将print(stu._ _name)更改为print(stu.Studen_ _name)
#顾安
Python中可通过 property 装饰器.为“私有”属性提供读取和修改的方法。通常放在类,函数或方法的声明之前,通过一个@符号表示将装饰器应用于类,函数或方法。
class Student:
def _ _init_ _(self,name,age):
#创建私有属性
self._ _name=name
self._ _age=age
#获取私有属性
@property
def name(self):
return self._ _name
#修改私有属性
@name.setter
def name(self,name):
self._ _name=name or '无名氏'
#获取私有属性
@property
def age(self):
return self._ _age
def study(self,course_name):
print(f'{self._ _name}正在学习{course_name}')
stu=Student('顾安',20)
print(stu.age,stu.name)
#20 顾安
stu.name=' '
print(stu.name)
#无名氏
stu.age=30
print(stu.age)
#系统报错 Traceback(most recent call last):
5)静态方法和类方法
在面向对象的世界里,一切皆为对象,我们定义的每一个类其实也是一个对象,而静态方法和类方法就是发送给类对象的消息。
那么,什么样的消息会直接发送给类对象呢?
举一个例子,定义一个三角形类,通过传入三条边的长度来构造三角形,并提供计算周长和面积的方法。
计算周长和面积肯定是三角形对象的方法。
在创建三角形对象时,传入的三条边长为必能构造三角形,为此我们可先写一个方法来验证给定的三条边长是否可构成三角形,此方法并不是对象方法,因为在调用这个方法时三角形对象还没有创建出来。可把这类方法设计为静态方法或类方法,也就是说此类方法不是发送给三角形对象的消息,而是发送给三角形类的消息。
class Triangle(object):
"""三角形类"""
def_ _init_ _(self,a,b,c):
"""初始化方法"""
self.a=a
self.b=b
self.c=c
#装饰器
@static method
def is_vaild(a,b,c):
"""判断三条边长能否构成三角形(静态方法)"""
return a+b>c and b+c>a and a+c>b
#@class method
#def is_vaild(cls,a,b,c):
#"""判断三条边长能否构成三角形(类方法)"""
#return a+b>c and b+c>a and a+c>b
def perimeter(self):
"""计算周长"""
return self.a+self.b+self.c
def area(self):
"""计算面积"""
p=self.perimter()/2
return(p*(p-self.a)*(p-self.b)*(p-self.c)**0.5
在调用静态方法时,不需要对当前类进行实例化
·可以直接使用类名,方法
静态方法与类方法的区别:1}静态方法传入的参数都是普通参数
2}类方法的参数第一位必须是cls,即class,代表当前的方法属于当前的类
3}静态方法是不和当前类进行绑定的,可看成一个单独的函数



