关于python的类的继承中需要注意的细节...

1.在类里面方法之外定义的属性必定不能被self修饰–【类里面方法之外定义的属性–类属性】
2.对于有self前缀修饰的变量都必须有将类实例化才能使用–【self前缀修饰的变量–实例变量】
3.init 函数只会在类实例化时调用

当使用的子类的init()函数重写时:
4.子类实例化时并不会实例化一个无名基类(父类)
5.类的封装性不足,子类可调用父类的私有方法–当父类私有方法没有使用实例变量时不会出错

当使用的子类的init()函数继承于父类时:
4.子类实例化时会实例化一个无名基类(父类)
5.类的封装性不足,子类可调用父类的私有方法–当父类私有方法使用实例变量时也不会出错

样例1
classProgramming.py

class Person:
	# 定义在类内部但在方法之外, 被称为类属性
    sex = 'man'
    """在类里面方法之外定义的属性必定不能被self修饰"""

    def __init__(self):
        """self 指的是类的实例本身,类比C++中的this,
        所以对于有self前缀修饰的变量都必须有将类实例化才能使用"""
        # init 函数只会在类实例化时调用
        # 定义该普通变量weight,受限于定义域
        weight = 45
        self.name = '#Person#'
        self.age = 0
        print('This is Person __init__ function')

    def print_message(self):
        print('This is public function.')

    def __print_message2(self):
        print('This is private function.')

    def using_pri_func(self):
        self.__print_message2()

    def get_name(self):
        return self.name

    def get_age(self):
        return self.age


class Student(Person):

    def __init__(self):
        self.name = 'Eugene-Forest'
        print('This is Student __init__ function')


"""man = Person()
man.print_message()
# 可通过该格式访问私有函数,侧面说明封装性的不足
man._Person__print_message2()"""

usingStu.py

from classPro import Student
try:
    stu = Student()
    print(stu.get_name())
    print(stu.sex)
    # print(stu.weight)
    print(stu.get_name())
    stu.print_message()
    stu.using_pri_func()
    stu._Person__print_message2()
    print(stu.get_age())
except AttributeError:
    print("'Student' object has no attribute 'XXX'")

**
This is Student init function
Eugene-Forest
man
Eugene-Forest
This is public function.
This is private function.
This is private function.
‘Student’ object has no attribute ‘XXX’

Process finished with exit code 0**

样例二

PS:将Student的init()函数注释掉

classProgramming.py

class Person:
    # 定义在类内部但在方法之外, 被称为类属性
    sex = 'man'
    """在类里面方法之外定义的属性必定不能被self修饰"""

    def __init__(self):
        """self 指的是类的实例本身,类比C++中的this,
        所以对于有self前缀修饰的变量都必须有将类实例化才能使用"""
        # init 函数只会在类实例化时调用
        # 定义该普通变量weight,受限于定义域
        weight = 45
        self.name = '#Person#'
        self.age = 0
        print('This is Person __init__ function')

    def print_message(self):
        print('This is public function.')

    def __print_message2(self):
        print('This is private function.')

    def using_pri_func(self):
        self.__print_message2()

    def get_name(self):
        return self.name

    def get_age(self):
        return self.age


class Student(Person):
	pass
    """def __init__(self):
        self.name = 'Eugene-Forest'
        print('This is Student __init__ function')"""


"""man = Person()
man.print_message()
# 可通过该格式访问私有函数,侧面说明封装性的不足
man._Person__print_message2()"""

usingStu.py

from classPro import Student
try:
    stu = Student()
    print(stu.get_name())
    print(stu.sex)
    # print(stu.weight)
    print(stu.get_name())
    stu.print_message()
    stu.using_pri_func()
    stu._Person__print_message2()
    print(stu.get_age())
except AttributeError:
    print("'Student' object has no attribute 'XXX'")

**This is Person init function
#Person#
man
#Person#
This is public function.
This is private function.
This is private function.
0

Process finished with exit code 0**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值