python中的类(二)
python中的类(二)
六、类的成员
字段:普通字段,静态字段
eg:
class Province():
country=’中国’ #静态字段,保存在类中,执行时可以通过类或对象访问
def __init__(self,name):
self.name=name #普通字段,保存在对象中,只能通过对象访问
print(Province.country) #中国,通过类访问
obj=Province(‘河南’)
print (obj.name) #河南,通过对象访问
print(obj.country) #中国,通过对象访问
方法:普通方法,静态方法,类方法
应用场景:
普通方法:对象中需要保存一些值,执行某功能时,需要使用对象中的值
静态方法:不需要任何对象中的值
eg:
class Foo():
def f1(self): #普通方法,保存在类中,由对象调用,形参self指调用的对象
print(123)
@staticmethod
def f2(a1): #静态方法,self不是必须的形参,保存在类中,可以通过类直接调用
print(a1)
@classmethod
def f3(cls): #类方法,形参cls指当前类名,所以可以通过类访问
print
属性
属性实际是方法,只是在在调用时不像调用方法那样在方法名后加括号。
class Foo():
@propery #用于执行obj.f4
def f4(self):
print (789)
return 1
@f4.settr #用于执行obj.f4=123
def f4(self,val)
print(val)
@f4.deleter #用于执行del obj.f4
def f4(self):
print(111)
调用:
obj=Foo() #创建对象
r=obj.f4 #调用属性
print (r) #
#
obj.f4=123 #
del obj.f4 #
成员修饰符
类的成员分为共有成员和私有成员。共有成员可以直接访问,而私有成员不可以外部直接访问。
共有成员:
以前创建的成员均为共有成员。
私有成员:
在创建成员时,在成员名前添加两个下划线即可。私有成员虽然外部无法直接访问,但是可以在类的内部访问。父类中的私有成员,子类也不可直接使用。
class Person ( ):
def __init__(self,name,age):
self.name=name #共有成员
self.__age=age #私有成员
def show():
print ( self.__age)
F=Person(‘tom’,18)
F.show() #18,通过类内部访问
F.name #tom,通过外部访问
特殊成员
__call__
class Call:
def __call__(self, *args, **kwargs):
print (‘ok’)
#调用方法一
F=Call()
F() #执行__call__方法,输出ok
#调用方法二
Call()() #执行__call__方法,输出ok
__str__
一般在print时使用。若不加此方法,print该类的对象时,显示的是该类的内存地址。
eg:
class F():
def __init__(self,n,a):
self.name=n
self.age=a
def __str__(self):
return self.name
#调用
A=F(’tom’,18)
print (A) #tom,执行时类似于print(str(A)),str(A)会自动调用F中的str方法,并获取其返回值
__del__(析构方法)
在该类的对象被销毁时,执行。
__getiterm__
通过索引取值。
eg:
class Person():
def __init__(self, name, age):
self.name = name
self.__age = age
def __getitem__(self, item):
return item+10
F=Person('tom',18)
print (F[2]) #12,自动执行F对象类中__getitem__方法。
__setiterm__
通过索引赋值。
eg:
class Person():
def __init__(self, name, age):
self.name = name
self.__age = age
def __setitem__(self, key, value):
print (key,value)
F=Person('tom',18)
F[3]=222 #3 222,自动执行F对象类中__setitem__方法。
__iter__
如果类中有__iter__方法,则该对象时可迭代对象
对象.__iter__()的返回值是迭代器
for循环遇到可迭代对象,则自动执行对象.__iter__(),生成迭代器,进行for循环。
eg:
class Person():
def __init__(self, name, age):
self.name = name
self.__age = age
def __iter__(self):
return iter([11, 22, 33])
F=Person('tom',18)
for i in F:
print(i)
metaclass
class F1(type):
def __init__(self,what,bases=None,dict=None):
super(F1, self).__init__(what,bases,dict)
print (1)
def __call__(self):
print (2)
self.__new__(self)
self.__init__(self)
class S(object,metaclass=F1):
def __new__(cls, *args, **kwargs):
pass
def __init__(self):
print (3)
输出结果为:
1
2
3
python中的类(二)的更多相关文章
- python中的类和实例
今天花了两个多小时后搜索相关博客看了看python中有关类和实例的介绍,差不多大概明白了. python中的类和c++中的类是一样的,不同之处就是c++的类,如果含有成员变量,并且成员变量发生变化后, ...
- Python中的类(一)
Python中的类(一) 一. 应用场景 如果多个函数中有一些相同的参数时,转换成面向对象. 二. 如何创建类 类是用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法 ...
- 关于Python中的类普通继承与super函数继承
关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接 ...
- GO-结构体(类似python中的类)
一.结构体有名属性 package main import "fmt" func main(){ type Sb struct { name string //属性名,数据类型 a ...
- python中元类(metaclass)的理解
原文地址:http://www.cnblogs.com/tkqasn/p/6524879.html 一:类也是对象 类就是一组用来描述如何生成一个对象的代码. 类也是一个对象,只要你使用关键字clas ...
- Python中的类、对象、继承
类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...
- 4、Python中的类详解(0601)
<大话数据结构>的作者程杰在博客园也有博客,网址是:http://cj723.cnblogs.com/ 面向对象编程(OOP) 1.程序 = 指令 + 数据 代码可以选择以指令为核心或以数 ...
- Python中的类(上)
在Python中,可以通过class关键字定义自己的类,然后通过自定义的类对象类创建实例对象. 例如,下面创建了一个Student的类,并且实现了这个类的初始化函数"__init__&quo ...
- python中新式类和经典类
python中的类分为新式类和经典类,具体有什么区别呢?简单的说, 1.新式类都从object继承,经典类不需要. Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Pyth ...
随机推荐
- MySQL---5、可视化工具Navicat for MySQL安装配置
一.安装文件包下载 Navicat for MySQL 安装软件和破解补丁: 链接:https://pan.baidu.com/s/1oKcErok_Ijm0CY9UjNMrnA 密码:4xb1 ...
- java 基础 --- volatile
问题 : volatile 解决的是什么问题 有什么应用场景 概述 某些共享变量的时候我们使用volatile 修饰,它会保证修改的值立即被更新到主存,或是从主存中获取最新的值.它的底层是如何实现的 ...
- 撩课-Web大前端每天5道面试题-Day13
1.前端需要注意哪些SEO? 合理的title.description.keywords:搜索对着三项的权重逐个减小,title值强调重点即可,重要关键词出现不要超过2次,而且要靠前,不同页面titl ...
- Linux 中文乱码
开发中不免会接触到linux,Linux系统中文语言乱码也是我们常碰到的一个问题之一. 在网上查找了不少资料,参考了https://www.linuxidc.com/Linux/2017-07/145 ...
- poj 2992 Divisors (素数打表+阶乘因子求解)
Divisors Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9617 Accepted: 2821 Descript ...
- MVC 事物同时保存,更新数据库
本人小白一枚,第一次写博,主要用作笔记,怕以后忘记了,大神尙可路过,也可多多指教 事物用在同时保存更新数据时,及只要在事物块的范围内,有一个操作出错则事物块所有更新,保存等操作都不会执行 ...
- Sspring bean被初始化加载2次
Sspring bean被初始化加载2次 spring框架的web项目时,启动的时候发现某个bean被加载了两次,比如使用SchedulingConfigurer或者使用@PostConstruct的 ...
- web 开发人员必须学习的 3 门语言
web 开发人员必须学习的 3 门语言:html css js HTML 定义了网页的内容 CSS 描述了网页的布局 JavaScript 网页的行为
- RabbitMq、ActiveMq、ZeroMq、kafka各个消息中间件之间的区别
MQ框架非常之多,比较流行的有RabbitMq.ActiveMq.ZeroMq.kafka.这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求. 第一部分:RabbitMQ,ActiveMq, ...
- JavaScript的进阶之路(七)客户端JavaScript知识点总结
一.客户端JavaScript主要是BOM DOM的操作和js脚本的兼容性.互用性.可访问性.安全性的应用.以及一些框架的引用. 二.BOM:浏览器对象模型 主要介绍window对象 1.定时器:se ...