Python基础概念

1、父类和子类的关系

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# python中的super(Net, self).__init__()
# 假设Net的父类比如是类NNet;super(Net, self)就是把类Net的对象self转换为类NNet的对象;.__init__()就是“被转换”的类NNet对象调用自己的init函数
#
class Person(object):  # 任何对象都可以继承于object
    def __init__(self, name, gender, age):
        self.name = name
        self.gender = gender
        self.age = age

# 注意:继承中子类对于父类的(构造)(初始化)即_init__()方法不会被自动调用,它需要在其子类的中亲自_init__()方法中专门调用
class Student(Person):  # Student 继承于 Person
    def __init__(self, name, gender, age, school, score):
        super(Student, self).__init__(name, gender, age)  # 从父类Person中引入name,gender,age 属性 也是在子类的构造方法中调用父类的构造方法
        # self.name = name.upper()  # title()首字母大写  lower()所有字母小写  upper()所有字母大写
        # self.gender = gender.upper()
        # self.age = age
        self.school = school
        self.score = score

s = Student('Alice', 'female', 18, 'Middle school', 87)
print(s.school)
print(s.name)
print(s.age)


# 定义一个动物类Animal为基类,它基本两个属性name和age、一个方法call
class Animal(object):  # 所有类都可以继承于object基类
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def call(self):
        print(self.name, '会叫')


# 定义一个Cat 猫类继承于Animal,猫类比动物类多一个sex属性
class Cat(Animal):  # Cat继承于Animal
    def __init__(self, name, age, sex):
        super(Cat, self).__init__(name, age) # 继承父类的属性
        self.sex = sex

    def call(self):  # 对父类方法重构作为子类的方法 (若没有重构,子类则会继承父类的方法)
        print(self.name, '会“喵喵”叫')


# 定义一个Dog 狗类继承于Animal,狗类比动物类多一个sex属性
class Dog(Animal):
    def __init__(self, name, age, sex):
        super(Dog, self).__init__(name, age)
        self.sex = sex

    def call(self):
        print(self.name, '会“汪汪”叫')


# 我们定义一个 do 函数,接收一个变量 ‘all‘ 这里也就是三个类的对象
# 多态
# C 是 Cat 类型,
# C拥有自己的 call() 方法以及从 Animal 继承的 call 方法,
# 但调用 C .call() 总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止
# all是任何数据类型的实例都可以,只要它有一个 call() 的方法即可,不一定是 Animal 或 Animal 的子类型
def do(all):
    all.call()


A = Animal('小黑', 4) # 定义三个类的对象
C = Cat('喵喵', 2, '男')
D = Dog('旺财', 5, '女')
# 调用各自的call方法 多态性
for x in (A, C, D):
    do(x)

if __name__ == '__main__':  # 单模块被引用时下面代码不会受影响,用于调试
    pass
   # c = Cat('喵喵', 2, '男')  #  Cat继承了父类Animal的属性
   # c.call()  # 输出 喵喵 会叫 ,Cat继承了父类Animal的方法

image

2、对象属性自动更新

# -*- coding:utf-8 -*-
#!python3
# -*- coding:utf-8 -*-
#!python3

# 第一种方法行不通
class DemoClss:
  def __init__(self,val1,val2):
    self.val1= val1
    self.val2= val2
    self.sum= self.val1 + self.val2
obj = DemoClss(123,234)
print(obj.sum)
obj.val1 = 321
print(obj.sum)

# 第二种方法采用函数调用的方法
class DemoClss:
  def __init__(self,val1,val2):
    self.val1= val1
    self.val2= val2
  def sum(self):
    return self.val1 + self.val2
obj = DemoClss(123,234)
print(obj.sum())  # 调用函数
obj.val1 = 321
print(obj.sum())  # 调用函数

# 第三种方法采用函数调用的方法
class DemoClss:
  def __init__(self,val1,val2):
    self.val1= val1
    self.val2= val2
  @property  # 属性
  def sum(self):
    return self.val1 + self.val2
obj = DemoClss(123,234)
print(obj.sum)  # 对象的属性打印
obj.val1 = 321
print(obj.sum)
posted @ 2025-06-29 20:51  变秃了也就变强了  阅读(22)  评论(0)    收藏  举报