图中 是四代同堂,香火延续。
python中的继承是怎么定义和操作的呢?
__name 表示私有 : 访问对象的私有属性 stu_Student__name ; 不能使用stu.__name访问私有属性
_name表示受保护: 相当于公有,不同包下面也是可以访问的。
class Teacher:
def __init__(self, name, age):
self.__name = name
self._age = age
def self_des(self):
print(f"""我叫 {self.__name},今年 {self._age} 岁""")
t1 = Teacher("李四",30)
t2 = Teacher("王五",20)
t1.self_des()
t2.self_des()
# print(t1.__name) #报错 AttributeError: 'Teacher' object has no attribute '__name'
print(t2._age) #保护变量可以在本类中访问
print(t1._Teacher__name)
# print(t2._Teacher_age) #报错
正常访问保护和私有属性:
不正常访问私有变量:
不正常访问保护变量:
在运行时可以改变它的结构的语言。
class Cat:
def __init__(self, name,color):
self.__name = name
self.__color = color
def show_self(self):
print(f"""名字是 {self.__name},颜色是 {self.__color}""")
black_cat = Cat("小黑","黑色")
black_cat.show_self()
# 动态增加属性
black_cat.age = 10
print("age is : ",black_cat.age)
# 动态删除属性
# del black_cat.age
print("age is : ",black_cat.age)
class Dog:
__slots__ = ("name", "age")
def __init__(self, name, age):
self.name = name
self.age = age
def self_introduce(self):
print(f"""我叫 {self.name},今年{self.age} 岁""")
def run(self,speed):
print(f"""我正在以{speed} m/s的速度向前跑""")
qg = Dog("忠犬七公", 8)
qg.self_introduce()
qg.sex = "公"
qg.self_introduce()
静态方法:发给类对象消息的方法。 @staticmethod 不要求第一个对象
类方法:发给类对象消息的方法。 @classmethod 第一个参数是类对象 clz
对象属性: 无参的方法也是属性。 @property
class Triangle:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
@property
def perimeter(self):
return self.a + self.b + self.c
@property
def area(self):
p = self.perimeter / 2 #注意不是调用方法
return (p * (p - self.a) * (p - self.b) * (p - self.c)) ** 0.5
t1 = Triangle(3, 4, 5)
print("t1.perimeter:", t1.perimeter)
print("t1.area:", t1.area)
class Triangle:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def perimeter(self):
return self.a + self.b + self.c
def area(self):
p = self.perimeter() / 2
return (p * (p - self.a) * (p - self.b) * (p - self.c)) ** 0.5
@staticmethod
def is_valid(a, b, c):
r = a + b > c and a + c > b and b + c > a
print(f"""边长分别为{a}, {b}, {c}的三角形{'' if r else '不'}是合法的""")
return r
Triangle.is_valid(1,2,10)
Triangle.is_valid(3,4,5)
class Triangle:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def perimeter(self):
return self.a + self.b + self.c
def area(self):
p = self.perimeter() / 2
return (p * (p - self.a) * (p - self.b) * (p - self.c)) ** 0.5
@classmethod
def is_valid(cls,a, b, c):
print(f"""cls is: {cls} , cls type is {type(cls)} """)
r = a + b > c and a + c > b and b + c > a
print(f"""边长分别为{a}, {b}, {c}的三角形{'' if r else '不'}是合法的""")
return r
Triangle.is_valid(1,2,10)
Triangle.is_valid(3,4,5)
继承:在已有的类上创建新类,减少重复代码的编写。 提供继承信息的类叫父类,超类,基类,得到继承信息的类叫子类,派生类,衍生类。
语法: class Son(Father):
如果没有指定父类,父类默认是object类
python允许多继承,一个子类可以有多个父类。
super函数可以调用父类的方法。
里氏替换: 子类对象替换父类对象
class People:
def __init__(self,name,age):
self.name = name
self.age = age
def eat(self):
print(self.self_des()," 我吃东西")
def sleep(self):
print(self.self_des()," 我睡觉")
def work(self):
print(self.self_des()," 我工作")
def play(self):
print(self.self_des()," 我玩")
def self_des(self):
return f"""姓名:{self.name},年龄:{self.age} ,"""
class Student(People):
def __init__(self,name,age,grade):
super().__init__(name,age)
self.grade = grade
def study(self):
print(super().self_des(),"my grade is :",self.grade," I am studying")
class Teacher(People):
def __init__(self,name,age,gender):
super().__init__(name,age)
self.gender = gender
def teach(self):
print(super().self_des(), "性别:",self.gender,"I can teach")
student1 = Student("小明", 11, 5)
teacher1 = Teacher("张老师", 30, "男")
student1.study()
student1.eat()
student1.sleep()
student1.play()
teacher1.teach()
teacher1.eat()
teacher1.sleep()
teacher1.play()
teacher1.work()
python是动态语言,可以动态添加属性,方法也是属性的一种,只不过该属性对应的是一个可以调用的方法。
面向对象的世界中,一切皆对象,类也是对象,也可以接收接收消息,通过类方法和静态方法。
通过继承,我们可以复用现有的类代码的能力,提高效率。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。