• Python 面向对象编程基础——初始化实例、类属性、方法


    #1.初始化实例化属性。
    #可接受任意关键字参数,并把他们都作为属性赋值给实例。使用**kw,除了可以直接使用self.name = 'xxx'设置一个属性外,还可以通过setattr(self, 'name', 'xxx')设置属性。
    class Person(object):
        def __init__(self, name, gender, **kw):
            self.name = name
            self.gender = gender
            for k,v in kw.items():
                setattr(self, k, v)
               
    xiaoming = Person('Xiao Ming', 'Male', birth='1990-1-1', job='Student')
    print(xiaoming.name)
    print(xiaoming.job)

    #2.类中的私有成员,双下划线开头的"__score"不能直接被外部访问。
    class Person1(object):
        def __init__(self, name, score):
            self.name = name
            self._gender = 'Male'
            self.__score = score
    p1 = Person1('Bob', 59)
    try:
        print(p1.__score)  #AttributeError: 'Person1' object has no attribute '__score'
    except AttributeError:
        print('attrbuteerror')

    #3.创建类属性。实例属性每个实例都各自拥有,互相独立,而类属性有且只有一份。
    class Person2(object):
        address = 'Earth'
        def __init__(self, name):
            self.name = name
    print(Person2.address)
    p2 = Person2('Tom')
    print(Person2.address)
    #请给Person3类添加一个类属性count每创建一个实例count属性就加1这样就可以统计出一共创建了多少个Person3的实例。
    class Person3(object):
        count = 0
        def __init__(self, name):
            self.name = name
            Person3.count += 1
    p3 = Person3('Alice')
    print(p3.count)
    p3_1 = Person3('Tim')
    print(p3_1.count)

    #4.python中类属性和实例属性名字冲突怎么办?
    #请把上节的Person3类属性count改为__count,再试试能否从实例和类访问该属性。
    class Person4(object):
        __count = 0
        def __init__(self, name):
            self.name = name
            Person4.__count += 1
            print(Person4.__count)
    p4 = Person4('Bob')
    p4_1 = Person4('Alice')
    try:
        print(Person4.__count)  #AttributeError: type object 'Person4' has no attribute '__count'
    except AttributeError:
        print('AttributeError')
    ##类属性的公开和私有,如果没有双下划线,外部可以调用,如果有,只能在类内部使用。

    #5.一个实例的私有属性就是以__开头的属性,无法被外部访问,那这些属性定义有什么用?
    #虽然私有属性无法从外部访问,但是,从类的内部是可以访问的。除了可以定义实例的属性外,还可以定义实例的方法。
    #实例的方法就是在类中定义的函数,它的第一个参数永远是self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的:
    class Person5(object):
        def __init__(self, name):
            self.__name = name
        def get_name(self):
            return self.__name
    p5 = Person5('Bob')
    print(p5.get_name())
    #任务:请给Person5类增加一个私有属性__score,表示分数,再增加一个实例方法get_grade(),
    #能根据__score的值分别返回A-优秀, B-及格, C-不及格三档。
    class Person6(object):
        def __init__(self, name, score):
            self.name = name
            self.__score = score
        def get_grade(self):
            if self.__score >= 80:
                return "A-Excellent"
            elif self.__score >= 60:
                return "B-Passed"
            return "C-Failed"
    p6_1 = Person6('Bob', 89)
    p6_2 = Person6('Alice', 69)
    p6_3 = Person6('Tim', 59)
    print(p6_1.get_grade())
    print(p6_2.get_grade())
    print(p6_3.get_grade())

    #6.python中方法也是属性,由于属性可以是普通的值对象,如str,int等,也可以是方法,还可以是函数,大家看看下面代码的运行结果,请想一想p6.get_grade为什么是函数而不是方法:
    class Person6(object):
        def __init__(self, name, score):
            self.name = name
            self.score = score
            self.get_grade = lambda: 'A'
    p6 = Person6('Bob', 90)
    print(p6.get_grade)    #<function Person6.__init__.<locals>.<lambda> at 0x000001D1244300D0>
    print(p6.get_grade())  #A
    #直接把lambda函数赋值给self.get_grade和绑定方法有所不同,函数调用不需要传入self,但是方法调用需要传入self。
    #p6.get_grade是属性,只不过这里的属性是一个函数对象.
    #p6.get_grade()是方法,前面的p6就是调用这个方法的对象,即实例,整句来说就是实例方法

  • 相关阅读:
    【今日CV 视觉论文速览】 19 Nov 2018
    【numpy求和】numpy.sum()求和
    【今日CV 视觉论文速览】16 Nov 2018
    【今日CV 视觉论文速览】15 Nov 2018
    poj 2454 Jersey Politics 随机化
    poj 3318 Matrix Multiplication 随机化算法
    hdu 3400 Line belt 三分法
    poj 3301 Texas Trip 三分法
    poj 2976 Dropping tests 0/1分数规划
    poj 3440 Coin Toss 概率问题
  • 原文地址:https://www.cnblogs.com/zhang-teng/p/6203724.html
Copyright © 2020-2023  润新知