python类变量与成员变量

类变量与成员变量

关注公众号“轻松学编程”了解更多。

​ 在类中声明的变量我们称之为类变量【静态成员变量】,
在__init__()函数中声明的变量并且绑定在实例上的变量我们称之为成员变量
类变量直接可以通过类名来调用。

1、若类变量与成员同时存在并且同名
使用对象来调用的时候,获取的结果是成员变量的值,
使用类名来调用,获取的是类变量的值。

2、若类变量存在,成员变量不存在,
使用对象来调用的时候,它首先寻找成员变量,
如果成员变量不存在。则去寻找类变量。

2、若类变量不存在,成员变量存在:
使用类名来调用,则会报错

总结:
类变量通过类名或者对象来调用都不会报错,但是成员变量只能通过对象来调用。
通过对象来修改类属性的时候,只能作用到对象自己本身,作用不到类,
若是通过类名来修改类属性,则只对类变量的值进行修改。

class Person(object):
    # 类变量
    name = "haha"
    age = "19"
    height = 170
    def __init__(self,name,age,weight):
        # 成员变量
        self.name = name
        self.age = age
        self.weight = weight

    def sayHeight(self):
        print(self.height)

per = Person("xiaoming",19,50)
print(per.name)
print(Person.name)

# print(Person.weight)
per.height = 190
print(per.height)
print(Person.height)
print('*********')
Person.height = 200
print(Person.height)
print(per.height)
per.sayHeight()
输出:
xiaoming
haha
190
170
*********
200
190
190

类方法与成员方法

类方法,成员方法
类方法:使用类名来调用的方法
成员方法:使用对象来调用的方法

若一个方法定义在类中,但是没有参数[一般默认self],此时我们只能通过类名来调用
若我们需要使用到一个类的对象,首先要实例化。

class Person(object):

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def say(self):
        print("I am %s, I am %d year old"%(self.name,self.age))

    def sayHello():
        print('hello I am class function')
per = Person("xiaoming",19)
per.say()

Person.sayHello()
输出:
I am xiaoming, I am 19 year old
hello I am class function

类方法与静态方法

静态方法:
当调用此方法时,不会将类的实例传递给它。
在类中定义的函数。
无需实例化类,就可以调用。它的定义在继承中,是不可变的。
类方法:
当调用此方法时,将函数所属的类作为第一个参数传递。

class A(object):
        def foo(self, x):
            print("executing foo(%s, %s)" % (self, x))
    
        @classmethod
        def class_foo(cls, x):
            print("executing class_foo(%s, %s)" % (cls, x))
        @staticmethod
        def static_foo(x):
            print("executing static_foo(%s)" % x)
    
    a = A()
    # 调用foo函数,参数传入1
    a.foo(1)
    
    # 调用class_foo,参数传入1
    A.class_foo(1)
    
    # 调用static_foo,参数传入1
    A.static_foo(1)
    a.static_foo(1)
输出:
executing foo(<__main__.A object at 0x0000024F126489B0>, 1)
executing class_foo(<class '__main__.A'>, 1)
executing static_foo(1)
executing static_foo(1)
    

下划线

下划线定义特殊的方法,一般情况下是系统定义名字,
如:

__init()__、__del()__

前双下划线(age):表示私有类型的变量(privated),只能在本类中进行访问,外界不能直接访问。如__age.

单下划线(_age):以单下划线开头的表示保护类型变量(protected),
保护类型的变量只允许本身以及子类访问,不能用于from module import *
[使用单下划线开头的时候,虽然变量能够直接被访问,但是请把变量视为一个保护类型的变量,尽量不要去访问。

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

公众号

赞赏码

关注我,我们一起成长~~

posted @ 2018-05-02 15:09  轻松学编程  阅读(425)  评论(0编辑  收藏  举报