一、私有属性
1、私有属性是什么?
两个下划线开头的属性是私有的(private)。其他为公共的(public)
2、私有属性的调用
1、类内部可以访问私有属性(方法)
2、 类外部不能直接访问私有属性(方法)
3、 类外部可以通过“_类名__私有属性(方法)名”访问私有属性(方法)
方法本质上也是属性!只不过是可以通过()执行而执行
class Employee:
__company="SXT"#私有类属性
def __init__(self,name,age):
self.__name=name #私有实例属性
self.__age=age #私有实例属性
def say_company(self):
print("{0},今年{1}岁了,在{2}上班".format(self.__name,self.__age,Employee.__company))#类内部可以调用私有实例属性,私有类属性
def __work(self):
print("好好工作")
a=Employee("KRYSTAL",26)
print(dir(a))#利用dir()查看Employee所有属性和方法
a.say_company()#利用say_copany()调用该公开方法
a._Employee__work()#利用__Employee__work()调用该私有方法
执行结果:
['_Employee__age', '_Employee__company', '_Employee__name', '_Employee__work', '__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__', 'say_company']
KRYSTAL,今年26岁了,在SXT上班
好好工作
二、@property 装饰器
class Employee:
def __init__(self,salary,name):
self.__salary=salary
self.__name=name
@ property #相当于salary 属性的getter 方法
def get_salary(self):
return ("{0}的工资是{1}".format(self.__name,self.__salary))
@ get_salary.setter #相当于salary 属性的setter 方法
def set_salary(self,salary):
if 0<salary<100000:
self.__salary=salary
else:
print("输入错误(输入工资的范围必须是0-100000")
a=Employee(10000,"高其")
print(a.get_salary)#get_salary 可以进行属性调用
a.set_salary=-2000
print(a.get_salary)
#######执行结果:
高其的工资是10000
输入错误(输入工资的范围必须是0-100000
高其的工资是10000
三、练习题
设计一个名为MyRectangle 的矩形类来表示矩形。这个类包含:
(1) 左上角顶点的坐标:x,y
(2) 宽度和高度:width、height
(3) 构造方法:传入x,y,width,height。如果(x,y)不传则默认是0,如果width
和height 不传,则默认是100.
(4) 定义一个getArea() 计算面积的方法
(5) 定义一个getPerimeter(),计算周长的方法
(6) 定义一个draw()方法,使用海龟绘图绘制出这个矩形
import turtle
class MyRectangle:
def __init__(self,x=0,y=0,width=100,height=100):#给x,y,width,height传入默认参数
self.x=x
self.y=y
self.height=height
self.width=width
def getArea(self):
s=self.width*self.height
print("MyRectangle的长是{0},宽是{1},面积是{2}".format(self.width,self.height,s))
def getPerimeter(self):
C=(self.width+self.height)*2
print("MyRectangle的长是{0},宽是{1},周长是{2}".format(self.width,self.height, C))
def draw(self):
turtle.goto(self.x,self.y)
turtle.forward(self.width)
turtle.goto(self.x+self.width,self.y-self.height)
turtle.goto(self.x,self.y-self.height)
turtle.goto(self.x,self.y)
turtle.done()#绘画结束后出现画像,不消失
a=MyRectangle()#当x,y,heigh,width都不传参数时,则使用x=0,y=0,width=100,height=100
a.getArea()
a.getPerimeter()
a.draw()