类成员

一、变量

1. 实例变量(字段)

  • 每个实例都应该拥有的变量
  • 实例变量中隐含着一个创建这个对象的类。通过这个类就能找到类中定义的全部内容,包括方法和属性信息等
  • 访问:对象.变量名
class Person(object):

    def __init__(self, name, age):
        self.name = name  # 实例变量
        self.age = age    # 实例变量


p1 = Person("Tom", 18)
print(p1.name)  # Tom  访问实例变量

p1.name = "Andy"  # 修改实例变量的值
print(p1.name)  # Andy

2. 类变量(静态变量)

  • 直接写在类中的变量,所有对象共享
  • 访问:类名.变量名,对象.变量名(不推荐,且只能访问,不能修改)
class Foo(object):
    count = 0  # 类变量

    def __init__(self):
        Foo.count += 1


print(Foo.count)    # 0 访问类变量
Foo()
Foo()
Foo()
print(Foo.count)  # 3

二、方法

1. 成员方法(实例方法)

  • 对象直接访问的方法
  • 访问:对象.方法名()
class User(object):

    def login(self):  # 实例方法
        print("欢迎登录")


u = User()
u.login()  # 调用实例方法

2. 类方法

  • cls指类本身,不管用对象还是用类去访问类方法,默认传递进去的是类
  • 调用:类名.方法名(),对象.方法名()(不推荐)

语法:

@classmethod
def 方法名(cls):
    pass
class Foo(object):

    @classmethod
    def add(cls, a, b):  # 类方法
        print(cls)
        return a + b


print(Foo)
print(Foo.add(1, 2))

结果:
<class '__main__.Foo'>
<class '__main__.Foo'>
3

3. 静态方法

  • 当出现一个方法不需要使用到实例变量和类变量时,就可以选择使用静态方法
  • 调用:类名.方法名(),对象.方法名()(不推荐)

语法:

@staticmethod
def 方法名.():
    pass
class Foo(object):

    @staticmethod
    def welcome():
        print("---Welcoming---")


Foo.welcome()  # ---Welcoming---

 


三、私有

    在Python中使用"__"作为方法或者变量的前缀,那么这个方法或者变量就是一个私有的

    如果类中存在继承关系,子类是无法继承父类的私有内容的

1. 私有变量

  • 私有变量不能直接访问,但可通过在公共方法中访问私有变量的值
  • 实例变量,类变量都可为私有
class Person(object):

    def __init__(self, salary):
        self.__salary = salary

    def sal(self):
        print(self.__salary)


p1 = Person(50000)
print(p1.__salary)  # 报错
p1.sal()  # 50000

 2. 私有方法

  • 私有方法只能在类中自己调用,类外面不能直接访问,可定义公共方法,在公共方法中调用私有方法
  • 实例方法,类方法,静态方法都可变为私有
class Person(object):

    def __init__(self, name, salary):
        self.name = name
        self.__salary = salary

    def __sal(self):
        print(self.__salary)

    def display(self):
        self.__sal()


p1 = Person("Tom", 50000)
p1.display()  # 50000

四、属性(@property)

  • 通过方法改造过来的一种变量的写法

注意:

  • 方法参数只能有一个self
  • 调用时不需要写括号,直接当成属性变量
  • 需要有返回值
class Person(object):

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

    @property
    def age(self):
        return 2018 - self.birthday


p = Person("Tom", 1994)
print(p.age)  # 24

增加方法,使之可以赋值:

class Test(object):

    def __init__(self):
        self.__num = 100

    @property
    def num(self):
        return self.__num

    @num.setter
    def num(self, new_num):
        self.__num = new_num


t = Test()
print(t.num)  # 100
t.num = 50
print(t.num)  # 50

 property另一种表达方式:

    property(fget=None, fset=None, fdel=None, doc=None)

  • fget:获取属性值的函数。
  • fset:设置属性值的函数。
  • fdel:删除属性值的函数。
  • doc:为该属性创建一个docstring。
class Test(object):

    def __init__(self):
        self.__num = 100

    def getnum(self):
        return self.__num

    def setnum(self, new_num):
        self.__num = new_num

    num = property(getnum, setnum)


p1 = Test()
print(p1.num)  # 100
p1.num = 50
print(p1.num)  # 50

五、类特殊成员

1)  __new__()

  • 构造方法
  • 在创建对象时,系统自动先执行__new__()来开辟内存,此时新开辟出来的内存区域是空的

2) __init__()

  • 初始化
  • 在__new__()调用完后,紧接着系统自动调用__init__()来完成对象的初始化工作

3) __str__()

  • 获取对象的描述信息
  • 触发:print(对象)

4) __repr__()

  • 调用:print(repr(对象))

5) __call__()

  • 触发:对象()

6) __del__()

  • 在删除对象或者程序结束,对象内存空间删除时,系统都会自动调用一次del方法

7) __getitem__()

  • 触发:对象[key]

8) __setitem__()

  • 触发:对象[key] = value

9) __delitem__()

  • 触发:del 对象[key]

10) __add__()

  • 触发:对象 + 对象 

11) __enter__()

  • 触发:with 对象 as 变量:

12) __exit__()

  • 触发:with 对象 as 变量:退出时

13) __iter__()

  • 触发:当遍历对象时

14) __hash__()

  • 调用:print(hash(对象))

15) __gt__()

  • 触发:对象1 > 对象2

16) __lt__()

  • 触发:对象1 < 对象2

17) __ge__()

  • 触发:对象1 >= 对象2
posted @ 2018-11-07 16:31  Ethan_Y  阅读(984)  评论(0编辑  收藏  举报