类中的特殊成员

一些类中的特殊成员:

创建一个类:

  1. class Foo:  
  2.     """ 
  3.    这是一个注释 
  4.    """  
  5.     name=""  
  6.     def f(self):  
  7.         pass  

查看他的所有成员有哪些:

  1. import inspect  
  2. print(inspect.getmembers(Foo))  

结果如下:


[(‘__class__‘, <class ‘type‘>),

(‘__delattr__‘, <slot wrapper ‘__delattr__‘ of ‘object‘ objects>),

(‘__dict__‘,

mappingproxy({‘__dict__‘: <attribute ‘__dict__‘ of ‘Foo‘ objects>,

‘__doc__‘: ‘ 这是一个注释 ‘,

‘__module__‘: ‘__main__‘,

‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Foo‘ objects>,

‘f‘: <function Foo.f at 0x048408A0>,

‘name‘: ‘‘})),

(‘__dir__‘, <method ‘__dir__‘ of ‘object‘ objects>),

(‘__doc__‘, ‘ 这是一个注释 ‘),

(‘__eq__‘, <slot wrapper ‘__eq__‘ of ‘object‘ objects>),

(‘__format__‘, <method ‘__format__‘ of ‘object‘ objects>),

(‘__ge__‘, <slot wrapper ‘__ge__‘ of ‘object‘ objects>),

(‘__getattribute__‘, <slot wrapper ‘__getattribute__‘ of ‘object‘ objects>),

(‘__gt__‘, <slot wrapper ‘__gt__‘ of ‘object‘ objects>),

(‘__hash__‘, <slot wrapper ‘__hash__‘ of ‘object‘ objects>),

(‘__init__‘, <slot wrapper ‘__init__‘ of ‘object‘ objects>),

(‘__le__‘, <slot wrapper ‘__le__‘ of ‘object‘ objects>),

(‘__lt__‘, <slot wrapper ‘__lt__‘ of ‘object‘ objects>),

(‘__module__‘, ‘__main__‘),

(‘__ne__‘, <slot wrapper ‘__ne__‘ of ‘object‘ objects>),

(‘__new__‘, <built-in method __new__ of type object at 0x69C5BAD0>),

(‘__reduce__‘, <method ‘__reduce__‘ of ‘object‘ objects>),

(‘__reduce_ex__‘, <method ‘__reduce_ex__‘ of ‘object‘ objects>),

(‘__repr__‘, <slot wrapper ‘__repr__‘ of ‘object‘ objects>),

(‘__setattr__‘, <slot wrapper ‘__setattr__‘ of ‘object‘ objects>),

(‘__sizeof__‘, <method ‘__sizeof__‘ of ‘object‘ objects>),

(‘__str__‘, <slot wrapper ‘__str__‘ of ‘object‘ objects>),

(‘__subclasshook__‘,

<built-in method __subclasshook__ of type object at 0x04B725B8>),

(‘__weakref__‘, <attribute ‘__weakref__‘ of ‘Foo‘ objects>),

(‘f‘, <function Foo.f at 0x048408A0>),

(‘name‘, ‘‘)]

区分其中的字段和方法去看:

  1. instance = []  
  2. function = []  
  3. for i in dir(Foo):  
  4.     if callable(getattr(Foo, i)):  
  5.         function.append(i)  
  6.     else:  
  7.         instance.append(i)  
  8. print(instance)  
  9. print(function)  
  10.   
     
  11. # [‘__dict__‘, ‘__doc__‘, ‘__module__‘, ‘__weakref__‘, ‘name‘]  
  12. # [‘__class__‘, ‘__delattr__‘, ‘__dir__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__le__‘, ‘__lt__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘f‘] 

我们看到有一下这些字段:

[‘__dict__‘, ‘__doc__‘, ‘__module__‘, ‘__weakref__‘, ‘name‘]

一个一个看:


__dict__


In [27]: Foo.__dict__

Out[27]:

mappingproxy({‘__dict__‘: <attribute ‘__dict__‘ of ‘Foo‘ objects>,

‘__doc__‘: ‘ 这是一个注释 ‘,

‘__module__‘: ‘__main__‘,

‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Foo‘ objects>,

‘f‘: <function __main__.Foo.f>,

‘name‘: ‘‘})

是用来存储对象属性的一个字典,其键为属性名,值为属性的值


__doc__


In [31]: Foo.__doc__

Out[31]: ‘ 这是一个注释 ‘

表示类的描述信息


__module__


In [32]: Foo.__module__

Out[32]: ‘__main__‘

表示从哪个模块导入的


__weakref__


看这个就好了: 其实就是没啥用

https://stackoverflow.com/questions/36787603/what-exactly-is-weakref-in-python


‘name‘


其实就是我们定义的静态字段

接下来是方法

[‘__class__‘, ‘__delattr__‘, ‘__dir__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__le__‘, ‘__lt__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘f‘]

/////////

__func__这样的都是内部方法

__init__ 构造方法:


def __init__(self):

super().__init__()

__call__ 对象后面加括号,触发执行。

def __call__(self, *args, **kwargs):
														pass
															

`模拟一个list

  1. # coding=utf-8  
  2. class Foo:  
  3.     """模拟一个list"""  
  4.     def  __getitem__(self, item):  
  5.   
     
  6.         if type(item)==int:  
  7.             print(item)  
  8.         else:  
  9.             start=item.start  
  10.             stop=item.stop  
  11.             step=item.step  
  12.             print(start)  
  13.     def  __setitem__(self, key, value):  
  14.         print(key,value)  
  15.     def __delitem__(self, key):  
  16.         print(key)  
  17.   
     
  18. f=Foo()  
  19. f[1]  
  20. f[5:3:5]  
  21. del f[9]  

 __iter__ 

用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__


In [46]: [1,2,3].__iter__()

Out[46]: <list_iterator at 0x4b7e6b0>

In [47]: iter([1,2,3])

Out[47]: <list_iterator at 0x4b7e790>

__next__方法 :next(obj)

自动调用obj的iter方法

__new__ 和 __metaclass__看上一个博客

利用__new__方法可以创建单例模式

时间: 2024-10-17 04:38:41

类中的特殊成员的相关文章

C++类中常量数据成员和静态数据成员初始化

常量数据成员初始化原则: 在每一个构造函数的初始化列表中初始化 静态数据成员初始化原则: 类内声明,类外初始化(因为它是属于类的,不能每构造一个对象就初始化一次) // test_max.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include <iostream> #include <vector> using namespace std; class A { public: A(int i):a(0) {} A():

c++类中对数据成员进行初始化和赋值的区别

在c++中定义一个类 ,对于构造函数 我们经常是这么写的: class test { public: test(int n_x , int n_y) { x = n_x; y = n_y; } private: int x , y; }; 这中写法虽然是合法的但比较草率 在构造函数 test(int n_x , int n_y)中 , 我们这样实际上不是对数据成员进行初始化 , 而是进行赋值. 正确的是初始化应该是这样的: class test { public: test() {} test(

友元——友元可以访问与其有好友关系的类中的私有成员。 友元包括友元函数和友元类。

简介:友元可以访问与其有好友关系的类中的私有成员.    友元包括友元函数和友元类. [1]将普通函数声明为友元函数 #include<iostream> using namespace std; class Time { public: Time(int,int,int); friend void display(Time &);//定义友元函数 private: int hour; int minute; int sec; }; Time::Time(int h,int m,int

在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static

在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static ! 在C语言中,我们使用pthread_create创建线程,线程函数是一个全局函数,所以在C++中,创建线程时,也应该使用一个全局函数.static定义的类的成员函数就是一个全局函数. 更多 参考  http://blog.csdn.net/ksn13/article/details/40538083 #include <pthread.h> #

类中的internal成员可能是一种坏味道

前言 最近除了搞ASP.NET MVC之外,我也在思考一些编程实践方面的问题.昨天在回家路上,我忽然对一个问题产生了较为清晰的认识.或者说,原先只是有一丝细微的感觉,而现在将它和一些其他的方面进行了联系,也显得颇为"完备".这就是问题便是:如何对待类中internal成员.我现在认为"类中的internal成员可能是一个坏味道",换句话说,如果您的类中出现了internal的成员,就可能是设计上的问题了. 可能这个命题说得还有些笼统,所以再详细地描述一下比较妥当.我

在仅拿到头文件的情况下,如何修改类中的私有成员值?

1 通过使用从对象开始处的硬编码/手工编码的偏移量构造指针来访问私有成员数据 class Weak { public: Weak() = default; ~Weak() = default; // 想想如果去掉该函数,外部想修改类中的私有成员变量 m_name 时该如何操作? void name(const std::string &name) { m_name = name; } std::string name() const { return m_name; } private: std

C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法

有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同.这些特殊的类型的成员变量包括: a.引用 b.常量 c.静态 d.静态常量(整型) e.静态常量(非整型) 常量和引用,必须通过参数列表进行初始化.    静态成员变量的初始化也颇有点特别,是在类外初始化且不能再带有static关键字,其本质见文末. 参考下面的代码以及其中注释:#include <iostream>using namespace std; class BClass{public: BClass

在另一个类中做数据成员的对象,可以先不初始化

class A { B b; } 因为在创建A类的时候,会先调用A的构造函数,同时对B类中的b对象调用他的构造函数 下面测试代码 class A { public: int a; A(int x) :a(x){}; }; class B:public A { private: A b; public: B(int x, int y) :A(x), b(y){} void display() { cout << a << endl << b.a << endl

C++笔记007:易犯错误模型——类中为什么需要成员函数

先看源码,在VS2010环境下无法编译通过,在VS2013环境下可以编译通过,并且可以运行,只是运行结果并不是我们期待的结果. 最初通过MyCircle类定义对象c1时,为对象分配内存空间,r没有初始化,其值为乱码,pi为3.1415926,area为乱码. [cin>>c1.r]这个语句为c1.r赋值,假设为10,然后执行[cout<<c1.area<<endl],我们来看,执行cout时是从内存空间中拿c1.area的值,这个值在定义对象时候已经确定是一个乱码值,此