一、方法
如果我们在类体中定义了多个重名的方法,只有最后一个方法有效。
1、私有方法和公共方法:
- 通常两个下划线开头的属性是私有的(private)。其他为公共的(public)。
- 类内部可以直接访问私有属性或方法
- 类外部不能直接访问私有属性或方法
- 类外部可以通过“_类名__私有属性或方法名”访问私有属性或方法
2、@property装饰器
@property 可以将一个方法的调用方式变成“属性调用”,但是不能赋值。
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 < 50000:
self.__salary = salary
else:
print("录入错误,薪水在1000-50000这个范围!")
作业:
@desc:设计一个名为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 Rectangle:
def __init__(self,x=0,y=0,height=100,width=100):
self.x = x
self.y = y
self.height = height
self.width = width
def getArea(self):
print("长方形的面积是:",self.height * self.width)
def getPerimeter(self):
print("长方形的周长是:",(self.height + self.width)*2)
def draw(self):
t = turtle.Pen()
t.penup()
t.goto(self.x,self.y)
t.pendown()
t.forward(self.width)
t.right(90)
t.forward(self.height)
t.right(90)
t.forward(self.width)
t.right(90)
t.forward(self.height)
r = Rectangle(20,0,200,100)
r.getArea()
r.getPerimeter()
r.draw()
3、继承
Python支持多重继承,一个子类可以继承多个父类。
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def say_age(self):
print("我不知道!")
class Student(Person):
def __init__(self,name,age,score):
Person.__init__(self,name,age)#必须显式调用,不然不会被调用
self.score = score
Tips:
1.子类构造函数必须显式调用父类,不然不会被调用
2.父类的私有属性,不能直接访问
类方法 mro()或者类属性__mro__可以输出这个类的继承层次结构,dir()可以查看对象属性,对应于内置函数 str() 用于类似print的方法。super()获得父类定义。
Python支持多重继承,一个子类可以有多个“直接父类”,但应尽量避免使用。
4.多态((polymorphism)
多态是同一个方法调用不同的对象,因此产生不同的行为
Tips:
- 方法才有多态,属性没有多态。
- 必须有继承+方法重写才能构成多态。