类和对象
- 类是对事物的抽象,对象是类的一个实例
- 面向对象的主要思想:
- 封装
- 继承
- 多态
类定义
- 类把需要的变量和函数组合到一起,这种包含称为“封装 ”
- class A(object):
- 类的结构:
类的属性
- 类的属性分为公有属性和私有属性
- 以双下划线开头的为私有属性,如__atrr
- 公有属性在类中和类外都能调用
- 私有属性不能在类外调用
- 在类外可通过 instance._classname__attribute 方式访问私有属性,一般用作测试
- 内置属性:由系统在定义类时默认添加的,有前后双下划线构成
类的方法
- 类的方法和普通函数的最大区别在于:至少有一个参数self
- 类的方法有如下几种:
- 公有方法:在类中和类外都能调用
- 私有方法:不能在类外调用,以双下划线开头 __func()
- 类方法:被classmethod()函数处理过的方法,除能被对象调用外,也能被类调用
- 静态方法:被staticmethod()函数处理过的方法,相当于“全局函数”,可被类直接调用,也可被所有实例化对象所调用,静态方法没有self参数
#!/usr/bin/python
#coding:utf8
class MyClass(object):
name = 'Karl'
id = 007
__age = 18
def think(self):
self.__age = 28
print "My name is %s" %self.name
print "My age is %s" %self.__age
me = MyClass()
print me.id
me.think()
[root@KARL ~]# python u3.py
7
My name is Karl
My age is 28
#!/usr/bin/python
#coding:utf8
class MyClass(object):
name = 'Karl'
id = 007
__age = 18
def think(self):
self.__age = 28
print "My name is %s" %self.name
print "My age is %s" %self.__age
me = MyClass()
print me.id
me.think()
# print me.__age ## 在类外无法直接调用类中的私有属性
print '*'*20
print me._MyClass__age ## 不推荐这样使用,一般用作测试
[root@KARL ~]# python u3.py
7
My name is Karl
My age is 28
********************
28
class MyClass(object):
name = 'Karl'
id = 007
__age = 18
def think(self):
self.__age = 28
print "My name is %s" %self.name
print "My age is %s" %self.__age
me = MyClass()
#me.think()
print '*'*20
print me.__dict__
[root@KARL ~]# python u3.py
********************
{}
#!/usr/bin/python
#coding:utf8
class MyClass(object):
name = 'Karl'
id = 007
__age = 18
def think(self):
self.__age = 28
print "My name is %s" %self.name
print "My age is %s" %self.__age
me = MyClass()
me.think()
print me.name
print me.id
print '*'*20
print me.__dict__
[root@KARL ~]# python u3.py
My name is Karl
My age is 28
Karl
7
********************
{'_MyClass__age': 28}
#!/usr/bin/python
#coding:utf8
class MyClass(object):
name = 'Karl'
id = 007
__age = 18
def think(self):
self.__age = 28
name = 'John'
print "My name is %s" %self.name
print "My age is %s" %self.__age
me = MyClass()
print '*'*20
print MyClass.name # 直接通过类获取类的属性
[root@KARL ~]# python u3.py
********************
Karl
▽
#!/usr/bin/python
#coding:utf8
class MyClass(object):
name = 'Karl'
id = 007
__age = 18
def think(self):
self.__age = 28
name = 'John'
print "My name is %s" %self.name
print "My age is %s" %self.__age
me = MyClass()
me.id = 123
print '*'*20
print MyClass.name # 直接通过类获取类的属性
print MyClass.id
print me.id
[root@KARL ~]# python u3.py
********************
Karl
7
123
#!/usr/bin/python
#coding:utf8
class MyClass(object):
name = 'Karl'
id = 007
__age = 18
def think(self):
self.__age = 28
name = 'John'
print "My name is %s" %self.name
print "My age is %s" %self.__age
me = MyClass()
me.id = 123
print '*'*20
print MyClass.name # 直接通过类获取类的属性
print MyClass.id
print me.id
print '#'*20
print MyClass.__dict__
[root@KARL ~]# python u3.py
********************
Karl
7
123
####################
{'__module__': '__main__', 'name': 'Karl', 'think': <function think at 0x7fc9aec715f0>, '_MyClass__age': 18, '__doc__': None, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, 'id': 7}
#!/usr/bin/python
#coding:utf8
class MyClass(object):
name = 'Karl'
id = 007
__age = 18
def think(self):
self.__age = 28
name = 'John'
print "My name is %s" %self.name
print "My age is %s" %self.__age
def __secret(self):
print "I can tell you a secret!"
def tell(self):
self.__secret()
cm = classmethod(tell) # classmethod不能处理私有方法
me = MyClass()
print '*'*20
me.tell()
print '#'*20
MyClass.cm()
[root@KARL ~]# python u3.py
********************
I can tell you a secret!
####################
Traceback (most recent call last):
File "u3.py", line 27, in <module>
MyClass.cm()
File "u3.py", line 19, in tell
self.__secret()
TypeError: unbound method __secret() must be called with MyClass instance as first argument (got nothing instead)
#!/usr/bin/python
#coding:utf8
class MyClass(object):
name = 'Karl'
id = 007
__age = 18
def think(self):
self.__age = 28
name = 'John'
print "My name is %s" %self.name
print "My age is %s" %self.__age
def __secret(self):
print "I can tell you a secret!"
def tell(self):
self.__secret()
cm = classmethod(think)
me = MyClass()
print '*'*20
me.tell()
print '#'*20
MyClass.cm()
[root@KARL ~]# python u3.py
********************
I can tell you a secret!
####################
My name is Karl
My age is 28
#!/usr/bin/python
#coding:utf8
class MyClass(object):
name = 'Karl'
id = 007
__age = 18
def think(self):
self.__age = 28
name = 'John'
print "My name is %s" %self.name
print "My age is %s" %self.__age
def __secret(self):
print "I can tell you a secret!"
def tell(self):
self.__secret()
def test(): # 注意没带参数self
print "This is a static func"
cm = classmethod(think) # 类方法
sm = staticmethod(test) # 静态方法
me = MyClass()
print '*'*20
me.tell()
print '#'*20
MyClass.sm()
[root@KARL ~]# python u3.py
********************
I can tell you a secret!
####################
This is a static func
以下两种代码效果相同
# 1) 通过类名调用类方法和静态方法
#!/usr/bin/python
#coding:utf8
class MyClass(object):
name = 'Karl'
id = 007
__age = 18
def think(self):
self.__age = 28
name = 'John'
print "My name is %s" %self.name
print "My age is %s" %self.__age
def __secret(self):
print "I can tell you a secret!"
def tell(self):
self.__secret()
def test(): # 注意没带参数self
print "This is a static func"
def test2(self):
print "This is a class func"
cm = classmethod(test2) # 类方法
sm = staticmethod(test) # 静态方法
me = MyClass()
print '*'*20
MyClass.cm()
print '#'*20
MyClass.sm()
# 1) 结果显示:
[root@KARL ~]# python u3.py
********************
This is a class func
####################
This is a static func
# 2) 通过装饰器实现相同效果
#!/usr/bin/python
#coding:utf8
class MyClass(object):
name = 'Karl'
id = 007
__age = 18
def think(self):
self.__age = 28
name = 'John'
print "My name is %s" %self.name
print "My age is %s" %self.__age
def __secret(self):
print "I can tell you a secret!"
def tell(self):
self.__secret()
@staticmethod
def test(): # 注意没带参数self
print "This is a static func"
@classmethod
def test2(self):
print "This is a class func"
# cm = classmethod(test2) # 类方法
# sm = staticmethod(test) # 静态方法
me = MyClass()
print '*'*20
MyClass.test2()
print '#'*20
MyClass.test()
# 2) 结果显示:
[root@KARL ~]# python u3.py
********************
This is a class func
####################
This is a static func
网友评论