阿杰学python,详解面向对象,继承
class Example(object):
def __init__(self, height, money, power):
self.height = height
self.power = power
"""
在属性前加双下划线后,该属性则被限制外部访问,一般来说要通过内部定义的函数来访问和更改,因为该
属性的名称已经改变了,不同的解释器改变后的名称不同
"""
self.__money = money
def get_money(self):
print(self.__money)
def set_money(self, money):
self.__money = money
def eat(self, food):
print("我已经吃了" + food)
"""
def E_money(self):
print("I have %s 元" % self.money)
"""
def __del__(self):
print("这里是析构函数")
"""
__str__():在调用print()打印对象是自动调用,是给用户用的,是一个描述对象的方法
__repr__():是给机器用的,在python解释器里面直接敲对象名在回车后调用的方法
注意:在没有str时,且有repr时,str = repr
优点:当需要打印一个对象的所有属性时,可以使代码简便
"""
def __str__(self):
return "%s-%d" % (self.power, self.height)
example1 = Example(175, 100000, "big")
example1.eat("apple")
print(type(example1.power))
print(example1)
example1.get_money()
class Father(object):
def __init__(self, name, age, power, money):
self.name = name
self.age = age
self.__money = money
self.power = power
def get_money(self):
return self.__money
def set_money(self, money):
self.__money = money
def eat(self, food):
print("我已经吃了%s" % food)
def __str__(self):
return "%s-%d-%d-%s" % (self.name, self.age, self.__money, self.power)
def run(self):
print("我正在跑步")
class Son1(Father):
def __init__(self, name, age):
super(Son1, self).__init__(name, age, power="low", money=0)
son = Son1("开心鬼", 18, )
print(son.name)
son.eat("banana")
print(son)
class Mother(object):
def __init__(self, name, age, face_value):
self.name = name
self.age = age
self.face_value = face_value
def dress(self):
print("我正在梳妆")
def __str__(self):
return "%s-%d-%d" % (self.name, self.age, self.face_value)
mother1 = Mother("clover", 21, 100)
print(mother1)
mother1.dress()
class Son2(Father, Mother):
def __init__(self, name, age, power, money, face_value, game_name, grade):
Father.__init__(self, name, age, power, money)
Mother.__init__(self, name, age, face_value)
self.grade = grade
self.game_name = game_name
def __str__(self):
return "name-%s-age-%d-power-%s-face_value-%d-game_name-%s-grade-%d" % (
self.name, self.age, self.power, self.face_value, self.game_name, self.grade)
son2 = Son2("cmx", 18, "big", 10000, 100, "王者", 150)
print(son2)
son2.eat("strawberry")
son2.dress()
son2.run()
print(son2.get_money())
"""
# 多态: 一种事物的多种形态
最终目标: 人可以喂任何一种动物
"""
class Animal(object):
def __init__(self, name):
self.name = name
def eat(self, food):
print(self.name + "已经吃了" + food)
class Person(object):
def feed_animal(self, animal, food):
print("给你食物")
animal.eat(food)
jerry = Animal("jerry")
per1 = Person()
per1.feed_animal(jerry, "apple")
"""
对象属性和类属性
类属性: 通过类名来调用
对象属性: 通过对象来调用
对象属性的优先级高于类属性
"""
class Temp(object):
name = "cmx"
age = 18
def __init__(self, age, money):
self.age = age
self.money = money
temp1 = Temp(20, 10000)
temp2 = Temp(21, 20000)
print(Temp.name, Temp.age)
print(temp1.name)
print(temp1.age)
del temp1.age
print(temp1.age)
temp1.money = 10000
temp1.car = "lamborghini"
print(temp1.car)
class Proper(object):
def __init__(self, student_id, name, age):
self.name = name
self._student_id = student_id
self.__age = age
@property
def say_name(self):
return "my name is" + self.name
@property
def student_id(self):
return self._student_id
"""
def get_age(self):
return self.__age
def set_age(self, age):
if age< 0:
age = int(input("年龄输入有误,请核对后再输入"))
self.__age = age
"""
@property
def age(self):
return self.__age
"""
python中的 @ *.setter装饰器可以总结为两个作用:(注意:这里的*必须是与@property下的函数同名的函数)
对要存入的数据进行预处理
设置可读属性(不可修改)
"""
@age.setter
def age(self, age):
if age < 0:
age = int(input("年龄输入有误,请核对后再输入"))
self.__age = age
data1 = Proper(1910911311, "cmx", 5)
print(Proper.say_name)
print(data1.student_id)
data1.age = 10
print(data1.age)
"""
就如同一般使用+-*/, 因为其之只能是字符串或者数字之间运算,所以不能直接用于对象相加
"""
class Num(object):
def __init__(self, num):
self.num = num
def __add__(self, other):
return Num(self.num + other.num)
def __str__(self):
return "num = %d" % self.num
num1 = Num(45)
num2 = Num(30)
print(num1 + num2)