zoukankan      html  css  js  c++  java
  • 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就是调用这个方法的对象,即实例,整句来说就是实例方法

  • 相关阅读:
    ORA-28000 帐户已被锁定问题处理
    德邦总管 修改oracle数据库用户密码的方法
    测试面试题目
    python 把一文件包含中文的字符写到另外文件乱码 UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position
    python version 2.7 required,which was not found in the registry
    ImportError: No module named dateutil.parser
    解决python2.x用urllib2证书验证错误, _create_unverified_context
    python多版本兼容性问题:当同时安装Python2和Python3后,如何兼容并切换
    MAC OS git客户端安装及操作
    Pycharm连接gitlab
  • 原文地址:https://www.cnblogs.com/zhang-teng/p/6203724.html
Copyright © 2011-2022 走看看