0%
这是一片思考的空间 -- arthinking
Spring 重构&代码整洁之道 软件设计 JVM 并发编程 数据结构与算法 分布式 存储 网络 微服务 设计模式
Java技术栈 - 涉及Java技术体系

Python语法笔记4

1、定义一个类:

class className:
block

block里面定义属性和方法,当类定义完之后,就产生了一个类对象。

1.1、类对象支持两种操作:引用和实例化

  • 引用操作:通过类对象调用类中的属性或者方法
  • 实例化:产生出一个类对象的实例

下面定义一个类:

#定义一个类
class user:
name = 'Jason'
nickname = 'arthinking'
def getName(self):
return self.name

#引用操作:
print user.name #Jason
#实例化
u = user() #实例化一个类对象
print u.name #Jason

1.2、Python中属性、方法和函数的区别:

属性:类中定义的变量,如上面的name;

方法:与某个对象进行绑定的函数,一把在类里面定义的函数与类对象或者实例对象绑定;

函数:在类外定义的函数,没有同对象进行绑定。

1.2.1、私有属性:

想把属性声明为私有的,可以再属性签名加两个下划线"__",这样就不能直接访问了。

class user2:
__name = 'Jason'
def getName(self):
return self.__name

u2 = user2()
print u2.getName()
#print u2.__name #AttributeError: user2 instance has no attribute '__name'

1.2.2、方法:

类中定义方法,同样使用def关键字,类中的方法至少有一个参数,一般以'self'的变量作为该参数,而且需要作为第一个参数,这个self就相当于对象自身的引用,和Java中的this类似。

私有方法:

同样的,在方法前面加两个下划线,表示该方法是私有的

类内置方法:

Python中有一些内置的方法,这些方法命名一两个下划线开始和结束:

构造方法:init(self, ...)

该方法在生成对象时进行一些初始化操作,无需显示调用,该方法支持重载。

析构方法:del(self)在释放对象时调用,在里面进行一些释放资源的操作,不需要显示调用。支持重载。

cmp()

len()

1.3、类属性、实例属性、类方法和实例方法:

类属性:和Java中的静态成员变量类似,对于共有的类属性,在类外可以通过类对象和实例对象方法。

实例属性:实例属性是不需要在类中显示定义的:

class user3:
__name= 'Jason'
def getName(self):
return self.__name
p3 = user3()
p3.age = 20
print p3.age #20
#print user3.age #AttributeError: class user3 has no attribute 'age'

上面创建了一个user3对象,并实例化,添加了一个age属性,而user3并不能持有该属性。

另外,也可以在实例化对象的时候给age赋值:

class user3:
__name='Jason'
def init(self, nickname):
self.nickname = nickname

u3 = user3(123)

print u3.nickname #123
#print user3.nickname #AttributeError: class user3 has no attribute 'nickname'

修改类属性:

必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,该属性会把类属性给屏蔽掉,除非删除了该属性。

class user:
username = 'Jason'

print user.username #Jason
u = user()
print u.username #Jason
u.username = 'Mike'
print u.username #Mike
del u.username #删除实例属性,访问到的则是类属性
print u.username #Jason

1.3.1、类方法

类方法是类对象所拥有的方法,需要用修饰器"@classmethod"来表示其为类方法,第一个参数必须是类对象,类方法能够通过实例对象和类对象去访问:

class user:
username = 'Jason'

@classmethod
def getUsername(cls):
    return cls.username

u = user()
print u.getUsername() #可以通过实例对象引用
print user.getUsername() #可以通过类对象引用

类方法可以对类属性进行修改

class user:
username = "Jason"
@classmethod
def getUsername(cls):
return cls.username

@classmethod
def setUsername(cls, username):
    cls.username = username

u = user()
print u.getUsername() #Jason
print user.getUsername() #Jason
u.setUsername("Mike") #通过类方法直接修改了类属性
print user.getUsername() #Mike

1.3.2、实例方法

在类中最常定义的成员方法,至少有一个参数,并且必须以实例对象作为其第一个参数。实例方法只能通过类实例去调用:

class user:
username = 'Jason'

def getUsername(self):
    return self.username

u = user()
print u.getUsername() #Jason
# print user.getUsername() #TypeError: unbound method getUsername() must be called with user instance as first argument (got nothing instead)

1.3.3、静态方法

通过修饰器"@staticmethod"进行修饰,静态方法无需多定义参数

class user:
username = 'Jason'

@staticmethod
def getUsername():
    return user.username

print user.getUsername()

2、继承

Python支持多继承,如下:

class animal:
name = 'object'

class dog(animal):
nickname = 'Baby'

print dog.name #object

如果有多个父类,使用逗号隔开

class animal:
def init(self, name):
self.name = name

def getName(self):
    return self.name

class role:
def init(self, name):
self.rolename = name

def getName(self):
    return self.rolename

class cat(animal, role):
def init(self, name, nickname, rolename):
animal.init(self, name) #子类通过父类调用父类的共有方法或属性
role.init(self, rolename)
self.nickname = nickname

def getNickname(self):
    return self.nickname

c = cat('Jason', 'Tomcat', 'admin')
print c.name #Jason
print c.nickname #Tomcat
print c.rolename #admin

在Python中,如果父类和子类都重新定义了构造方法,在进行子类实例化的时候,子类的构造方法不会自动调用父类的构造方法,需要在子类中显示调用

子类不继承父类的私有属性和方法,所以在子类中无法通过父类名来访问父类的私有属性和方法。

多重继承的情况下,子类没有定义构造函数时,会自动调用第一个父类的构造方法,包括多个父类有同名的方法时,优先选择第一个父类的。

欢迎关注我的其它发布渠道

订阅IT宅
内功修炼
Java技术栈
Java架构杂谈是IT宅精品文章公众号,欢迎订阅:
📄 网络基础知识:两万字长文50+张趣图带你领悟网络编程的内功心法 📄 HTTP发展史:三万长文50+趣图带你领悟web编程的内功心法 📄 HTTP/1.1:可扩展,可靠性,请求应答,无状态,明文传输 📄 HTTP/1.1报文详解:Method,URI,URL,消息头,消息体,状态行 📄 HTTP常用请求头大揭秘 📄 HTTPS:网络安全攻坚战 📄 HTTP/2:网络安全传输的快车道 📄 HTTP/3:让传输效率再一次起飞 📄 高性能网络编程:图解Socket核心内幕以及五大IO模型 📄 高性能网络编程:三分钟短文快速了解信号驱动式IO 📄 高性能网络编程:彻底弄懂IO复用 - IO处理杀手锏,带您深入了解select,poll,epoll 📄 高性能网络编程:异步IO:新时代的IO处理利器 📄 高性能网络编程:网络编程范式 - 高性能服务器就这么回事 📄 高性能网络编程:性能追击 - 万字长文30+图揭秘8大主流服务器程序线程模型
📄 Java内存模型:如果有人给你撕逼Java内存模型,就把这些问题甩给他 📄 一文带你彻底理解同步和锁的本质(干货) 📄 AQS与并发包中锁的通用实现 📄 ReentrantLock介绍与使用 📄 ReentrantReadWriteLock介绍与使用 📄 ReentrantLock的Condition原理解析 📄 如何优雅的中断线程 📄 如何优雅的挂起线程 📄 图解几个好玩的并发辅助工具类 📄 图解BlockingQueue阻塞队列
📄 消息队列那么多,为什么建议深入了解下RabbitMQ? 📄 高并发异步解耦利器:RocketMQ究竟强在哪里? 📄 Kafka必知必会18问:30+图带您看透Kafka
📄 洞悉MySQL底层架构:游走在缓冲与磁盘之间 📄 SQL运行内幕:从执行原理看调优的本质 📄 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法